Python Flask-web表单使用详解

作者:潇潇、寒 时间:2022-07-14 01:55:59 

Flask-WTF扩展可以把处理web表单的过程变成一种愉悦的体验。

Python Flask-web表单使用详解

一、跨站请求伪造保护

默认情况下,Flask-WTF能够保护所有表单免受跨站请求伪造的攻击。恶意网站把请求发送到被攻击者已登录的网站时就会引起CSRF攻击。

为了实现CSRF保护,Flask-WTF需要程序设置一个密钥。Flask-WTF使用这个密钥生成加密令牌,再用令牌验证请求中表单数据的真伪。设置密钥的方法如下所示:


app = Flask(__name__)
app.config['SECRET_KEY']='hard to guess string'

二、表单类

使用Flask-WTF时,每个web表单都由一个继承自Form的类表示。这个定义表单中的一组字段,每个字段都用对象表示。字段对象可附属一个或多个验证函数。验证函数用来验证用户提交的输入值是否符合要求。


#!/usr/bin/env python
#简单的web表单,包含一个文本字段和一个提交按钮

from flask_wtf import Form
from wtforms import StringField,SubmitField
from wtforms.validators import Required

class NameForm(Form):
 name = StringField('What is your name?',validators=[Required()])
 submit = SubmitField('Submit')

StringField类表示属性为type="text"的<input>元素,SubmitField类表示属性为type="submit"的<input>元素。

WTForms支持的HTML标准字段

Python Flask-web表单使用详解

WTForms验证函数

Python Flask-web表单使用详解

四、把表单渲染成HTML

表单字段是可用的,在模板中调用后会渲染成HTML。假设视图函数把一个NameForm实例通过参数form传入模板,在模板中可以生成一个简单的表单,如下所示:


<form method="POST">
 {{ form.hidden_tag() }}
 {{ form.name.label }} {{ form.name() }}
 {{ form.submit() }}
</form>

<form method="POST">
 {{ form.hidden_tag() }}
 {{ form.name.label }} {{ form.name(id='my-text-field') }}
 {{ form.submit() }}
</form>

Flask-Bootstrap提供了一个非常高端的辅助函数,可以使用Bootstrap中预先定义好的表单样式渲染整个Flask-WTF表单,而这些操作只需调用一次即可完成。


{% import "boostrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}

#使用Flask-WTF和Flask-Bootstrap渲染表单

{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}

{% block title %}Flasky{% endblock %}

{% block page_content %}
<div class="page-header">
 <h1>Hello,{% if name %}{{ name }}{% else %}Stranger{% endif %}</h1>
</div>
{{ wtf.quick_form(form) }}
{% endblock %}

 四、在视图函数中处理表单


@app.route('/',methods=['GET','POST'])
def index():
 name = None
 form = NameForm()
 if form.validate_on_submit():
   name = form.name.data
   form.name.data = ''
 return render_template('index.html',form=form,name=name)

app.route修饰器中添加的methods参数告诉Flask在URL映射中把这个视图函数注册为GET和POST请求的处理程序。如果没指定methods参数,就只把视图函数注册为GET请求的处理程序。

 五、重定向和用户会话


#!/usr/bin/env python

from flask import Flask,render_template,session,redirect,url_for
app = Flask(__name__)

@app.route('/',methods=['GET','POST'])
def index():
 form = NameForm()
 if form.validate_on_submit():
   session['name'] = form.name.data
   return redirect(url_for('index'))
 return render_template('index.html',form=form,name=session.get('name'))

六、Flash消息

例子:提示用户名或密码错误,弹出窗口


from flask import Flask,render_template,session,redirect,url_for,flash
app = Flask(__name__)

@app.route('/',methods=['GET','POST'])
def index():
 form = NameForm()
 if form.validata_on_submit():
   old_name = session.get('name')
   if old_name is not None and old_name != form.name.data:
     flash('Looks like you have changed your name!')
   session['name'] = form.name.data
   return redirect(url_for('index'))
 return render_template('index.html',form=form,name=session.get('name'))

#渲染Flash消息

{% block content %}
<div class="container">
 {% for message in get_flashed_messages() %}
 <div class="alert alert-warning">
   <button type="button" class="close" data-dismiss="alert">×</button>
   {{ message }}
 </div>
 {% endfor %}
 {% block page_content %}{% endblock %}
</div>
{% endblock %}

来源:http://www.cnblogs.com/caicairui/p/7780633.html

标签:Python,Flask,web,表单
0
投稿

猜你喜欢

  • Python中pandas dataframe删除一行或一列:drop函数详解

    2021-07-09 16:46:47
  • python鼠标绘图附代码

    2021-09-09 17:10:26
  • Python排序算法之堆排序算法

    2023-01-17 02:00:55
  • Python实现选择排序

    2021-06-17 03:23:40
  • Python面向对象之反射/自省机制实例分析

    2022-07-27 06:57:53
  • Python的Flask框架中实现简单的登录功能的教程

    2023-10-26 19:18:48
  • 系统默认的MySQL用户名消失的解决方法

    2008-12-02 14:26:00
  • 关于设计品质保证(DQA)的几点想法

    2007-11-16 16:55:00
  • Python实现的爬虫刷回复功能示例

    2021-08-30 08:25:22
  • python实现linux下使用xcopy的方法

    2022-08-16 07:52:09
  • Python无损音乐搜索引擎实现代码

    2021-01-28 19:19:02
  • 记录下两个正则表达式的使用

    2009-11-30 12:56:00
  • matplotlib quiver箭图绘制案例

    2023-07-13 10:04:11
  • Python采用Django制作简易的知乎日报API

    2023-10-07 13:02:34
  • 如何编制一个产生随机密码的函数?

    2009-11-08 19:06:00
  • python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)

    2021-02-03 19:41:24
  • 详解Python绘图Turtle库

    2021-11-29 05:42:06
  • 零基础写python爬虫之urllib2使用指南

    2022-10-17 04:00:44
  • 使用Python实现控制摄像头的方法详解

    2023-01-15 14:38:12
  • 百度、谷歌和雅虎的近日LOGO

    2008-05-19 12:11:00
  • asp之家 网络编程 m.aspxhome.com