flask入门之表单的实现


Posted in Python onJuly 18, 2018

一、原生表单

form.html

{% extends 'common/base.html' %}
{% block title %}
  原生表单
{% endblock %}
{% block pagecontent %}
{#  <form action="{{ url_for('check') }}" method="post">#}
  <form action="{{ url_for('form') }}" method="post">
    <p>用户名: <input type="text" name="username" placeholder="请输入用户名" maxlength="12"></p>
    <p>密码: <input type="password" name="userpass" placeholder="请输入密码..."></p>
    <p><input type="submit" value="提交"></p>
  </form>
{% endblock %}

manage.py

@app.route('/form/')
def form():
  return render_template('form1.html')

#接收表单的数据
@app.route('/check/',methods=['POST'])
def check():
  print(request.form)
  return '提交过来了'

将俩个路由地址合并为同一个

@app.route('/form/',methods=['GET','POST'])
def form():
  if request.method == 'POST':
    print(request.form)
  return render_template('form1.html')

二、使用flask-wtf表单扩展库

作用: 是一个用于表单处理的扩展库 提供表单的校验 csrf的功能

pip install flask-wtf

使用

(1) 字段类型

字段名称 字段类型
StringField 普通文本字段
PasswordField 密码框
SubmitField 提交按钮
TextAreaField 多行文本域
HiddenField 隐藏域
DateField 日期
DateTimeField 日期时间
IntegerField 整形
FloatFIeld 浮点型
RadioField 单选字段
SelectField 下拉
FileField 文件上传字段
BooleanField 布尔字段

(2) 验证器

验证器 说明
DataRequired 必填
Length 长度 min max
IPAddress IP地址
Email 邮箱
URL 地址
Regexp 正则匹配
EqualTo 验证俩个字段值的正确性
NumberRange 输入值的范围 min max

实例

在manage中

from flask import Flask,render_template,request
from flask_script import Manager
from flask_bootstrap import Bootstrap
#导入自定义表单类的基类
from flask_wtf import FlaskForm
#导入表单的字段
from wtforms import StringField,PasswordField,SubmitField
#导入验证器
from wtforms.validators import Length,DataRequired

app = Flask(__name__)
bootstrap = Bootstrap(app)
#加密种子 csrf需要使用
app.config['SECRET_KEY'] = 'abcdedff'
manager = Manager(app)

class Login(FlaskForm):
  username = StringField('用户名',validators=[Length(min=6,max=12,message='用户名的长度为6~12为'),DataRequired(message='用户名不能为空!!!')])
  userpass = PasswordField('密码',validators=[Length(min=6,max=12,message='用户名的长度为6~12为'),DataRequired(message='密码不能为空!!!')])
  submit = SubmitField('登录')

@app.route('/')
def index():
  return render_template('index.html')

@app.route('/form/',methods=['GET','POST'])
def form():
  #将表单类实例化
  form = Login()
  if request.method == 'POST':
    #验证是否存在正确的csrftoken和 数据的正确性 如果都正确则为真
    if form.validate_on_submit():
      # print(request.form)
      print(form.username.data)
  return render_template('form2.html',form=form)
from flask import Flask,render_template,request
from flask_script import Manager
from flask_bootstrap import Bootstrap
#导入自定义表单类的基类
from flask_wtf import FlaskForm
#导入表单的字段
from wtforms import StringField,PasswordField,SubmitField
#导入验证器
from wtforms.validators import Length,DataRequired


app = Flask(__name__)
bootstrap = Bootstrap(app)
#加密种子 csrf需要使用
app.config['SECRET_KEY'] = 'abcdedff'
manager = Manager(app)

class Login(FlaskForm):
  username = StringField('用户名',validators=[Length(min=6,max=12,message='用户名的长度为6~12为'),DataRequired(message='用户名不能为空!!!')])
  userpass = PasswordField('密码',validators=[Length(min=6,max=12,message='用户名的长度为6~12为'),DataRequired(message='密码不能为空!!!')])
  submit = SubmitField('登录')

@app.route('/')
def index():
  return render_template('index.html')

@app.route('/form/',methods=['GET','POST'])
def form():
  #将表单类实例化
  form = Login()
  if request.method == 'POST':
    #验证是否存在正确的csrftoken和 数据的正确性 如果都正确则为真
    if form.validate_on_submit():
      # print(request.form)
      print(form.username.data)
  return render_template('form2.html',form=form)

在模板中

{% extends 'common/base.html' %}
{% block title %}
  原生表单
{% endblock %}
{% block pagecontent %}
  <form action="{{ url_for('form') }}" method="post">
    <p>{{ form.csrf_token }}</p>
    <p>{{ form.username.label() }} {{ form.username(style='color:red;',class='userclass',placeholder='请输入用户名') }}
      {% if form.errors%}
      <span style="color:red;">{{ form.errors.username.0 }}</span>
      {% endif %}
    </p>
    <p>{{ form.userpass.label() }} {{ form.userpass() }}</p>
    <p>{{ form.submit() }}</p>
  </form>
{% endblock %}

使用 bootstrap渲染表单

{% import 'bootstrap/wtf.html' as wtf %}
{% block pagecontent %}
  <div class="row">
    <div class="col-md-8">图片</div>
    <div class="col-md-4">{{ wtf.quick_form(form,action="",method="") }}
    </div>
  </div>
{% endblock %}

自定义表单验证器

class Login(FlaskForm):
  ...
  def validate_username(self,field):
    # print(field)
    if field.data == 'zhangsan':
    # if self.username.data == 'zhangsan':
      raise ValidationError('该用户已存在')

注意:

validate_ 验证的字段名称 为固定格式

所有字段和验证器方法的使用

class Login(FlaskForm):
  username = StringField('用户名',validators=[Length(min=6,max=12,message='用户名的长度为6~12为'),DataRequired(message='用户名不能为空!!!')])
  userpass = PasswordField('密码',validators=[Length(min=6,max=12,message='用户名的长度为6~12为'),DataRequired(message='密码不能为空!!!'),EqualTo('confirm',message='俩次密码输入不一致')])
  confirm = PasswordField('确认密码')
  info = TextAreaField('个人简介',validators=[Length(min=6,max=20,message='内容为6-20个长度'),DataRequired(message='内容不能为空')],render_kw={"style":"resize:none;",'placeholder':"请输入你此刻的感谢..."})
  hidde = HiddenField()
  birth = DateField('出生日期')
  birth = DateTimeField('出生日期')
  age = IntegerField('年龄',validators=[NumberRange(min=6,max=99,message='年龄为6~99岁')])
  money = FloatField()

  sex = RadioField(choices=[('w','女'),('m','男')])
  address = SelectField(choices=[('1001','北京'),('1002','上海'),('1003','天津')])

  file = FileField('文件上传')

  argee = BooleanField('请仔细阅读以上条款')

  ip = StringField('IPV4',validators=[IPAddress(message='请输入正确的ip地址')])
  url = StringField('url地址',validators=[URL(message='输入正确的url地址')])
  email = StringField('email',validators=[Email(message='请输入正确的邮箱地址')])
  preg = StringField('手机号码',validators=[Regexp('^[1][3-8][0-9]{9}$',flags=re.I,message='请输入正确的手机号码')])
  submit = SubmitField('登录')

三、flash 消息的显示

概述: 当用户请求 或者有消息的显示 通过flash,get_flashed_messages 来进行操作

导入

from flask import flash,get_flashed_messages

from flask import flash,get_flashed_messages

class Login(FlaskForm):
  username = StringField('用户名',validators=[DataRequired(message='用户名不能为空')])
  userpass = PasswordField('密码',validators=[DataRequired(message='密码不能为空')])
  submit = SubmitField('登录')

@app.route('/form/',methods=['GET','POST'])
def form():
  form = Login()
  if form.validate_on_submit():
    if form.username.data == 'zhangsan' and form.userpass.data == '123456':
      flash('登录成功')
      return redirect(url_for('index'))
    else:
      flash('当前用户不存在')
  return render_template('user/login.html',form=form)

使用

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
跟老齐学Python之不要红头文件(1)
Sep 28 Python
python获取android设备的GPS信息脚本分享
Mar 06 Python
利用python程序生成word和PDF文档的方法
Feb 14 Python
解决pandas read_csv 读取中文列标题文件报错的问题
Jun 15 Python
python 统计数组中元素出现次数并进行排序的实例
Jul 02 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
Jul 02 Python
python使用PIL实现多张图片垂直合并
Jan 15 Python
pyqt远程批量执行Linux命令程序的方法
Feb 14 Python
python解析yaml文件过程详解
Aug 30 Python
基于Tensorflow高阶读写教程
Feb 10 Python
django的403/404/500错误自定义页面的配置方式
May 21 Python
Python中可变和不可变对象的深入讲解
Aug 02 Python
Flask入门之上传文件到服务器的方法示例
Jul 18 #Python
flask入门之文件上传与邮件发送示例
Jul 18 #Python
Sanic框架流式传输操作示例
Jul 18 #Python
django 发送邮件和缓存的实现代码
Jul 18 #Python
python实现linux下抓包并存库功能
Jul 18 #Python
python调用tcpdump抓包过滤的方法
Jul 18 #Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
Jul 18 #Python
You might like
《PHP边学边教》(02.Apache+PHP环境配置――下篇)
2006/12/13 PHP
PHP网站备份程序代码分享
2011/06/10 PHP
ThinkPHP使用心得分享-上传类UploadFile的使用
2014/05/15 PHP
非常实用的PHP常用函数汇总
2014/12/17 PHP
PHP动态柱状图实现方法
2015/03/30 PHP
PHP+JQuery+Ajax实现分页方法详解
2016/08/06 PHP
在IE下:float属性会影响offsetTop的取值
2006/12/22 Javascript
javascript 数组的方法集合
2008/06/05 Javascript
让js弹出窗口居前显示的实现方法
2013/07/10 Javascript
js去除空格的12种实用方法
2013/11/08 Javascript
JS跨域问题详解
2014/11/25 Javascript
深入理解javascript严格模式(Strict Mode)
2014/11/28 Javascript
深入讲解AngularJS中的自定义指令的使用
2015/06/18 Javascript
BootStrap+Angularjs+NgDialog实现模式对话框
2016/08/24 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
2017/03/11 Javascript
利用Node.js了解与测量HTTP所花费的时间详解
2017/09/22 Javascript
webpack打包react项目的实现方法
2018/06/21 Javascript
vue+Vue Router多级侧导航切换路由(页面)的实现代码
2018/12/20 Javascript
vue+element项目中过滤输入框特殊字符小结
2019/08/07 Javascript
浅析Vue中拆分视图层代码的5点建议
2019/08/15 Javascript
Vue实现多标签选择器
2019/11/28 Javascript
WEB前端性能优化的7大手段详解
2020/02/04 Javascript
javascript实现前端分页功能
2020/11/26 Javascript
[48:02]Ti4循环赛第三日 VG vs Liquid和NEWBEE vs DK
2014/07/12 DOTA
用python处理图片实现图像中的像素访问
2018/05/04 Python
python 编写简单网页服务器的实例
2018/06/01 Python
Python实现图片转字符画的代码实例
2019/02/22 Python
Python+Django+MySQL实现基于Web版的增删改查的示例代码
2020/05/13 Python
Python新手如何进行闭包时绑定变量操作
2020/05/29 Python
美国室内盆栽植物购买网站:Plants.com
2020/04/24 全球购物
C/C++程序员常见面试题二
2015/11/19 面试题
人事主管的岗位职责
2013/11/16 职场文书
优秀学生党员先进事迹材料
2014/05/29 职场文书
2014广电局实施党的群众路线教育实践活动方案思想汇报
2014/09/22 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书
深入理解python多线程编程
2021/04/18 Python