Flask教程笔记-CSRF token保护验证
#! coding=utf8
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from flask_bootstrap import Bootstrap
from flask_wtf.csrf import CsrfProtect
#导入CsrfProtect的模块
app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)
csrf = CsrfProtect(app)#app项目加载CsrfProtect
bootstrap = Bootstrap(app)
from app.views import IndexView
User Form验证模块代码
# -*- coding:utf-8 -*-
__author__ = 'pyphrb'
from flask_wtf import Form
from wtforms import StringField,SubmitField
from wtforms.validators import DataRequired
class MyForm(Form):
name = StringField('name', validators=[DataRequired(message=u"姓名不能为空")])
submit = SubmitField(u'提交')
html代码index.html
<form method="POST" action="/submit">
{{ form.csrf_token }}
#判断name的表单验证是否有问题,有问题直接显示error信息
{% if form.errors.name %}
{{ form.name.label }} {{ form.name(size=20) }}
{% for error in form.errors.name %}
<span>{{ error }}</span>
{% endfor %}
{% else %}
{{ form.name.label }} {{ form.name(size=20) }}
{% endif %}
{% if form.errors.csrf_token %}
{% for error in form.errors.csrf_token %}
<span>{{ error}}</span>
{% endfor %}
{% endif %}
#判断csrf是否有错误
{{ form.submit }}
</form>
controller的view信息
__author__ = 'pyphrb'
from app import app
from flask import render_template, url_for, request, make_response
from flask import session, redirect, escape
from app.form import User
from app import csrf
@app.route('/', methods=['GET','POST'])
def index():
userForm = User.MyForm(request.form)
return render_template('Index/index.html', form=userForm)
@app.route('/submit', methods=['POST'])
def submit():
userForm = User.MyForm()
if request.method == 'POST' and userForm.validate():
#判断访问是否是post并且通过验证表单,进行一下操作
print 'xxx'
return "xxxx"
else:
#验证失败,返回模板,提示错误信息
return render_template('Index/index.html', form=userForm)
csrf验证注意事项
当你定义你的表单的时候,如果犯了 这个错误
_ : 从 wtforms 中导入 Form 而不是从 flask.ext.wtf 中导入,CSRF 保护的大部分功能都能工作(除了 form.validate_on_submit()),但是 CSRF 保护将会发生异常。在提交表单的时候,你将会得到 Bad Request/CSRF token missing or incorrect 错误。这个错误的出现就是因为你的导入错误,而不是你的配置问题。