《Python Web开发实战》踩地雷记17/3/26
2017-03-26 15:34
197 查看
Linux修改文件名:mv [文件名1] [文件名2]
1.Flask-WTF
Flask-WTF扩展可以把处理Web表单的过程编程一种愉快的体验。这个扩展对独立的WTForms包进行了包装,方便集成到Flask程序中。
2.跨站请求伪造保护
默认情况下,Flask-WTF能保护所有表单面免受跨站请求伪造(Cross-Site Request Forgery,CSRF)的攻击。恶意网站把请求发送到被攻击者已登录的其他网站是就会引发CSRF攻击。
为了实现CSRF保护,Flask-WTF需要程序设置一个密钥。Flask-WTF使用这个密钥生成加密令牌,再用令牌验证请求中表单数据的真伪。
3.表单类
使用Flask-WTF时,每个Web表单都由一个继承自Form的类表示,这个类定义表单中的一组字段,每个字段都用对象表示,字段对象可附属一个或多个验证函数。
hello.py:定义表单类
index.html:渲染表单
Flask-Bootstrap提供了一个非常高端的辅助函数,可以使用Bootstrap中预先定义好的表单演示渲染整个Flask-WTF表单,而这些操作只需一次调用即可完成。wtf.quick_form()函数的参数为Flask-WTF表单对象,使用Bootstrap样式渲染传入的表单。
4.在视图函数中处理表单
视图函数index()要接收表单中的数据
hello.py:路由方法
app.route修饰器中添加的methods参数告诉Flask在URL映射中把这个视图函数注册为GET和POST请求的处理程序,如果没有指定methods参数,就只把视图函数注册为GET请求处理程序。因为Web表单提交为POST方式,故需要显示标明
GET 浏览器告知服务器:只 获取 页面上的信息并发给我。这是最常用的方法。
POST 浏览器告诉服务器:想在 URL 上 发布新信息。并且,服务器必须确保 数据已存储且仅存储一次。这是 HTML 表单通常发送数据到服务器的方法。
5.重定向和用户会话
重定向是一种特殊的响应,响应内容是URL,而不是包含HTML代码的字符串,为了不让Web程序把POST请求作为浏览器发送的最后一个请求,使用重定向解决重复提交出现弹框问题。
hello.py:重定向和用户会话
redirect()函数的参数是重定向的URL,使用url_for()生成URL映射生成URL,从而保证URL和定义的路由兼容,而且修改路由名字后依然可用
6.Flash消息
hello.py:Flash消息
base.html:渲染Flash消息
遇到的问题:
1.定义表单类时
这里的Form要用flask_wtf.FlaskForm替换
Warning: flask_wtf.Form has been renamed to “FlaskForm”
2.遇到错误
File”/home/shitfly/webgo/venv/local/lib/python2.7/site-packages/wtforms/validators.py”,line220,in__init__super(Required, self).init(*args, **kwargs)
TypeError: init() takes at most 2 arguments (3 given)
原因:
1.Flask-WTF
Flask-WTF扩展可以把处理Web表单的过程编程一种愉快的体验。这个扩展对独立的WTForms包进行了包装,方便集成到Flask程序中。
pip install flask-wtf
2.跨站请求伪造保护
默认情况下,Flask-WTF能保护所有表单面免受跨站请求伪造(Cross-Site Request Forgery,CSRF)的攻击。恶意网站把请求发送到被攻击者已登录的其他网站是就会引发CSRF攻击。
为了实现CSRF保护,Flask-WTF需要程序设置一个密钥。Flask-WTF使用这个密钥生成加密令牌,再用令牌验证请求中表单数据的真伪。
app = Flask(__name__) app.config['SECRET_KEY'] = 'secret-key'
3.表单类
使用Flask-WTF时,每个Web表单都由一个继承自Form的类表示,这个类定义表单中的一组字段,每个字段都用对象表示,字段对象可附属一个或多个验证函数。
hello.py:定义表单类
from flask_wtf import Form from wtforms import StringField,SubmitField from wtforms.validators import Required class NameForm(Form): name = StringField('你的名字?',validators=[Required()]) submit = SubmitField('提交')
index.html:渲染表单
{% extends "base.html" %} {% import "bootstrap/wtf.html" as wtf %} {% block title %}Flasky{% endblock %} {% block page_content %} <div class="page-header"> {% if name %} <h1> Hello,{{ name }}! </h1>{% else %}<h1>Hello,Stranger!</h1> {% endif %} </div> {{ wtf.quick_form(form) }} {% endblock %}
Flask-Bootstrap提供了一个非常高端的辅助函数,可以使用Bootstrap中预先定义好的表单演示渲染整个Flask-WTF表单,而这些操作只需一次调用即可完成。wtf.quick_form()函数的参数为Flask-WTF表单对象,使用Bootstrap样式渲染传入的表单。
4.在视图函数中处理表单
视图函数index()要接收表单中的数据
hello.py:路由方法
@app.route('/',methods=['GET','POST']) def index(): name = None nameForm = NameForm() if nameForm.validate_on_submit(): name = nameForm.name.data nameForm.name.data = '' return render_template('index.html',form=nameForm,name=name)
app.route修饰器中添加的methods参数告诉Flask在URL映射中把这个视图函数注册为GET和POST请求的处理程序,如果没有指定methods参数,就只把视图函数注册为GET请求处理程序。因为Web表单提交为POST方式,故需要显示标明
GET 浏览器告知服务器:只 获取 页面上的信息并发给我。这是最常用的方法。
POST 浏览器告诉服务器:想在 URL 上 发布新信息。并且,服务器必须确保 数据已存储且仅存储一次。这是 HTML 表单通常发送数据到服务器的方法。
5.重定向和用户会话
重定向是一种特殊的响应,响应内容是URL,而不是包含HTML代码的字符串,为了不让Web程序把POST请求作为浏览器发送的最后一个请求,使用重定向解决重复提交出现弹框问题。
hello.py:重定向和用户会话
from flask import Flask,render_template,session,url_for,redirect @app.route('/',methods=['GET','POST']) def index(): name = None nameForm = NameForm() if nameForm.validate_on_submit(): session['name'] = nameForm.name.data nameForm.name.data = '' return redirect(url_for('index')) return render_template('index.html',form=nameForm,name=session.get('name'))
redirect()函数的参数是重定向的URL,使用url_for()生成URL映射生成URL,从而保证URL和定义的路由兼容,而且修改路由名字后依然可用
6.Flash消息
hello.py:Flash消息
from flask import Flask,render_template,session,url_for,redirect,flash @app.route('/',methods=['GET','POST']) def index(): form = NameForm() if nameForm.validate_on_submit(): old_name=session.get('name') if old_name is not None and old_name != form.name.data: flash('name changed') session['name'] = nameForm.name.data return redirect(url_for('index')) return render_template('index.html',form=nameForm,name=session.get('name'))
base.html:渲染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 }} < b4de ;/div> {% endfor %} {% block page_content %}{% endblock %} </div> {% endblock %}
遇到的问题:
1.定义表单类时
class NameForm(Form): name = StringField('你的名字?',validators=[Required()]) submit = SubmitField('提交')
这里的Form要用flask_wtf.FlaskForm替换
Warning: flask_wtf.Form has been renamed to “FlaskForm”
2.遇到错误
File”/home/shitfly/webgo/venv/local/lib/python2.7/site-packages/wtforms/validators.py”,line220,in__init__super(Required, self).init(*args, **kwargs)
TypeError: init() takes at most 2 arguments (3 given)
原因:
name=StringField('What is your name?',validators=[Required()])未加()
相关文章推荐
- 《Python Web开发实战》踩地雷记17/3/24
- 《Python Web开发实战》踩地雷记17/3/21
- 《Python Web开发实战》踩地雷记17/3/23
- 《Python Web开发实战》踩地雷记17/3/27
- 《Python Web开发实战》踩地雷记17/3/22
- leetcode做题总结,题目3Sum,4Sum,3Sum Closest---- 2012/01/16-17-26
- text1.txt begin10 11 12 20 21 22 30 31 32 end text2.txt begin 15 16 17 25 26 27 35 36 37 得到text3.txt
- 有一个Map集合里面存储的是学生的姓名和年龄,内容如下{赵四=21,王二=17,张三=18,小丫=25,李四=26,王五=38}(15分) * a.将里面的元素用两种遍历方式打印到控制台上 *
- 17 - 03 - 26 图解HTTP(30)
- 超星视频讲座笔记(2014-3-19,4-14,4-16,4-17,4-22,4-26)
- java生成不重复的随机数【某个范围0-10】或者【某个数组int[1,3,56,14,26,22,17]】
- NetBeans 时事通讯(刊号 # 26 - Sep 17, 2008)
- C/C++ | 26-17 已知一个单向链表的头,删除其某一个结点的算法
- NetBeans 时事通讯(刊号 # 26 - Sep 17, 2008)
- 17 - 05 - 26 Python contents / children / descendants 区别
- 17-7-26-react-router入门
- NetBeans 时事通讯(刊号 # 26 - Sep 17, 2008)
- minSdk(API 26) > deviceSdk(API 17)
- Python-CodeWars-17-11-26
- 17 - 01 - 26 计算机网络(16)(运输层概述)