Flask 系列之 FlaskForm

通过使用 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:mysql@127.0.0.1:3306/todo'
    SQLALCHEMY_TRACK_MODIFICATIONS = False

    SECRET_KEY = "you will never known it."

此时,当我们运行起我们的网站后进入注册页面 http://127.0.0.1:5000/register 进行用户注册,如果注册完成后自动跳转到登陆页面则表示用户注册已经可以正常运行了。

原文地址:https://www.cnblogs.com/hippieZhou/p/10596666.html

时间: 2024-11-13 11:24:05

Flask 系列之 FlaskForm的相关文章

Flask系列:数据库

这个系列是学习<Flask Web开发:基于Python的Web应用开发实战>的部分笔记 对于用户提交的信息,包括 账号.文章 等,需要能够将这些数据保存下来 持久存储的三种方法: 文件:shelve(pickle 和 DBM 的结合)等,提供类似字典的对象接口 关系型数据库(SQL) 非关系型数据库(NoSQL) 其他 通常会使用数据库保存信息,并向数据库发起查询获取信息 SQL,关系型数据库 关系型数据库把数据存储在表中,表在程序中通过 Python 的类实现.例如,订单管理程序的数据库中

Flask 系列之 Pagination

说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 实现当前登录用户的事务浏览.添加.删除 操作 实现 首先,在我们的 todolist\forms.py 中添加事务添加对应的表单类 ThingForm,示例代码如下所示: from flask_wtf import FlaskForm from wtforms import StringField, SubmitField, TextAreaField,

flask系列一之环境搭建包安装

一,python的安装 (1)python的安装 (2)虚拟环境的配置 参考:http://www.cnblogs.com/bfwbfw/p/7995245.html 1,虚拟环境的建立 (1)使用pip安装虚拟环境 pip install virtualenv (2)安装包管理虚拟环境 pip install virtualenvwrapper-win (3)使用mkvirtualenv 命令安装项目虚拟环境 mkvirtualenv ZhiLiaoProject 2,通过pycharm新建一

Flask系列(十)自定义Form组件

一.wtforms源码流程 1.实例化流程分析 # 源码流程 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._wtforms_meta中 2. 执行构造方法 a. 循环cls._unbound_fields中的字段,并执行字段的bind方法,然后将返回值添加到 self._fields[name] 中. 即: _fields = { name: wtforms.fields.core.StringField

Flask系列(九)flask-script组件

Flask Script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shell,设置数据库的脚本,cronjobs,及其他运行在web应用之外的命令行任务:使得脚本和系统分开: Flask Script和Flask本身的工作方式类似,只需定义和添加从命令行中被Manager实例调用的命令: 官方文档:http://flask-script.readthedocs.io/en/latest/ 一.创建并运行命令 首先,创建一个Python模板运行命令

Flask系列 路由系统

Flask路由系统细分 from flask import Flask app = Flask(__name__) @app.route('/') def index(): return 'ok' if __name__ == '__main__': app.run() 从这个简单的代码入口,来剖析一下路由@app.route('/') route():就是一个加在index()上的装饰器 ?```python def route(self, rule, **options): # rule:匹

Flask源码分析一:服务启动

前言 Flask是目前为止我最喜欢的一个Python Web框架了,为了更好的掌握其内部实现机制,这两天准备学习下Flask的源码,将由浅入深跟大家分享下,其中Flask版本为1.1.1. Flask系列文章: Flask开发初探 正文 本文将结合源码跟踪看下Flask是如何启动并运行一个服务的. 首先,继续贴上最简单的应用: from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): retu

Flask容器化部署原理与实现

本文将介绍Flask的部署方案:Flask + Nginx + uWSGI,并使用docker进行容器化部署,部署的实例来源 Flask开发初探,操作系统为ubuntu. Flask系列文章: Flask开发初探 WSGI到底是什么 Flask源码分析一:服务启动 Flask路由内部实现原理 部署方案 在开发时,我们使用flask run命令启动的开发服务器是werkzeug提供的,但是这种方式目的是为了开发,不能很好的扩展,不适合生产部署.生产部署,我们需要一个更强健,性能更高的WSGI服务器

Flask权限管理

权限管理是一个很常见的功能模块,本文基于RBAC模型针对于多用户,多角色,多权限的场景,介绍一种Flask权限管理方案. Flask系列文章: Flask开发初探 WSGI到底是什么 Flask源码分析一:服务启动 Flask路由内部实现原理 Flask容器化部署原理与实现 本文将在开发初探的代码基础上进行重构. 介绍 在本文所述场景中,具体的权限管理是:权限和角色关联,给用户添加角色,用户即拥有角色的权限,也就是基于角色的权限控制.当然,若需要基于用户的权限控制也是可以的,只需要修改下相关数据