1. 程式人生 > >Flask 系列之 FlaskForm

Flask 系列之 FlaskForm

one pytho ali template avi 管理器 htm ror edi

技術分享圖片

通過使用 FlaskForm ,可以方便快捷的實現表單處理。

說明

  • 操作系統:Windows 10
  • Python 版本:3.7x
  • 虛擬環境管理器:virtualenv
  • 代碼編輯器:VS Code

實驗目標

通過使用 flask_wtf 進行表單的相關操作,並完成新用戶合法性註冊。

安裝

pip install flask_wtf

使用

首先,我們在 todolist 目錄中創建一個 forms.py 文件,定義一個註冊的表單類, 用於完成用戶註冊。示例代碼如下所示:

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, TextAreaField, PasswordField
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError
from models import User


class RegisterForm(FlaskForm):
    username = StringField('用戶名:', validators=[
                           DataRequired(), Length(min=6, max=20)])
    email = StringField('郵箱:', validators=[DataRequired(), Email()])
    pwd = PasswordField('密碼:', validators=[
        DataRequired(), Length(min=8, max=120)])
    confirm = PasswordField('確認密碼:', validators=[
                            DataRequired(), EqualTo('pwd')])
    submit = SubmitField('提交')

    def validate_username(self, username):
        user = User.query.filter_by(name=username.data).first()
        if user:
            raise ValidationError("用戶昵稱已存在。")

    def validate_email(self, email):
        user = User.query.filter_by(email=email.data).first()
        if user:
            raise ValidationError('郵箱已存在.')

然後修改我們的路由視圖 todolist\app\views.py,示例代碼如下所示:

from flask import render_template, redirect, url_for, flash
from werkzeug.security import generate_password_hash
from app import app, db
from forms import RegisterForm
from models import User


@app.route('/')
@app.route('/index')
def index():
    return render_template('index.html', title="首頁")


@app.route('/login')
def login():
    return render_template('login.html', title='登錄')


@app.route('/register', methods=['POST', 'GET'])
def register():
    form = RegisterForm()
    if form.validate_on_submit():
        username = form.username.data
        email = form.email.data
        pwd = form.pwd.data
        print(username, email, pwd)
        hash = generate_password_hash(pwd)
        user = User(name=username, email=email, pwd=pwd)
        db.session.add(user)
        db.session.commit()
        flash('註冊成功', category='info')
        return redirect(url_for('login'))
    return render_template('register.html', title='註冊', form=form)

然後,修改 todolist\app\templates\base.html ,添加閃現消息,示例代碼如下所示:

<!doctype html>
<html lang="en">

<head>
    {% block head %}
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> {% block styles %}
    <!-- Bootstrap CSS -->
    <link rel="icon" href="{{ url_for('static', filename='favicon.ico') }}"> {{ bootstrap.load_css() }} {% endblock %}
    {% if title %}
    <title>{{title}}</title>
    {% else %}
    <title>願望清單</title>
    {% endif %} {% endblock %}
</head>

<body>

    {% include "nav.html" %}

    <div class="container">

        {% for message in get_flashed_messages() %}
        <div class="alert alert-primary" role="alert">
            {{ message }}
        </div>
        {% endfor %}

        <!-- Your page contont -->
        {% block content %}{% endblock%}
    </div>

    {% block scripts %}
    <!-- Optional JavaScript -->
    {{ bootstrap.load_js() }} {% endblock %}

</body>

</html>

接著,完善 todolist\app\templates\register.html 中的註冊表單,示例代碼如下所示:

{% extends 'base.html' %} {% block content %}
<h1>註冊頁面</h1>

{% from 'bootstrap/form.html' import render_form %}
{{ render_form(form) }}
{% endblock %}

註:由於我們使用了 flask_bootstrap 插件,所有我們可以直接通過它來渲染出我們的表單。

最後,由於表單提交會涉及 跨域訪問問題 CSRF,所以我們需要修改我們的 todolist\config.py 文件,添加一個 SECRET_KEY 字段,示例代碼如下所示:

import os

basedir = os.path.abspath(os.path.dirname(__file__))


class Config(object):
    SQLALCHEMY_DATABASE_URI = os.environ.get(
        'SQLALCHEMY_DATABASE_URI') or 'mysql+pymysql://root:[email protected]:3306/todo'
    SQLALCHEMY_TRACK_MODIFICATIONS = False

    SECRET_KEY = "you will never known it."

此時,當我們運行起我們的網站後進入註冊頁面 http://127.0.0.1:5000/register 進行用戶註冊,如果註冊完成後自動跳轉到登陸頁面則表示用戶註冊已經可以正常運行了。

Flask 系列之 FlaskForm