Flask 从入门到实践

Flask 从入门到实践

路由的介绍

程序实例保存了一个URL到Python程序的映射关系,处理URL和函数之间关系的程序成为路由javascript

使用程序实例的app.route装饰器便可把要修饰的函数(可称为视图函数,下例中为index(),user())注册为路由。css

from flask import Flask
from flask import request

app = Flask(__name__)


@app.route('/')
def index():
    return '<h1>Hello World!</h1>'

@app.route('/user/<name>')
def user(name):
    return '<h1>Hello, %s !</h1>' %name

@app.route('/users/<int:id>')
def users(id):
    return '<h1>Your ID is : %d !</h1>' %id

@app.route('/info/')
def info():
    user_agent = request.headers.get('User-Agent')
    return '<p>Your browser is %s</p>' % user_agent

  
if __name__ == '__main__':
    app.run(debug=True)

Flask上下文全局变量

变量名 上下文 说明
current_app 程序上下文 当前激活程序的程序实例
g 程序上下文 处理请求时用做临时存储的对象,每次请求会重设该变量
request 请求上下文 请求对象,封装了客户端发出的HTTP请求中的内容
session 请求上下文 用户会话,用于存储请求之间须要“记住”的值的词典

Flask中有两种上下文:程序上下文和请求上下文,在调用以前须要先激活。html

视图函数用来处理客户端发来的请求,Flask用app.route装饰器或者非装饰器的app.add_url_rule() 来生成URL映射。java

在处理请求以前或以后执行处理的代码称为请求钩子函数,Flask支持如下4种装饰器来实现:python

  • before_first_request:处理第一个请求前运行
  • before_request:每次请求前运行
  • after_request:如没有未处理的异常抛出,在每次请求以后运行
  • teardown_request:便是有未处理的异常也在每次请求后运行

在请求析构函数和视图函数之间共享数据通常使用上下文全局变量 g.web

Flask中可用make_response来自定义响应对象,例如携带cookie等:正则表达式

from flask import make_response
@app.route('/cookie/')
def cookie_test():
    response = make_response('<h1>This document carries a cookie!</h1>')
    response.set_cookie('year', '2017')
    return response

302重定向:flask

from flask import redirect
@app.route('/r/')
def redirect():
    return redirect('http://www.hython.com')

处理错误的响应用abort函数,若抛出异常则交控制权给web服务器:bootstrap

from flask import abort
@app.route('/user/<id>')
def get_user(id):
    user = load_user(id)
    if not user:
        abort(404)
    return '<h1>Hello, %s</h1>' % user.name

Jinja2模板的使用

Jinja2变量过滤器

过滤器名 说明
safe 渲染值时不转义
capitalize 把值的首字母转换成大写,其他的小写
lower 把值转换成小写形式
upper 把值转换成大写形式
title 值中的每一个单词的首字母转换成大写
trim 把值的首尾空格去掉
striptags 渲染以前把值中全部的HTML标签都删掉

控制结构

  1. 条件控制语句:if
  2. for循环
  3. 宏函数(macros)

Flask-Bootstrap插件

flask bootstrap基模板中定义的块

块名 说明
doc 整个HTML文档
html_attribs 标签的属性
html 标签中的内容
head 标签中的内容
title 标签中的内容</td> </tr>
metas 一组 标签
styles css样式表定义
body_attribs 标签的属性
body 标签中的内容
navbar 用户定义的导航条
content 用户定义的页面内容
scripts 文档底部的JavaScript声明

若是须要从新定义块,好比自定义css和js的styles和scripts,需使用jinja2中的super()函数:api

{% block scripts %}
{{ super() }}
<script type="text/javascript" scr="my-script.js"></script>
{% endblock %}

url_for()函数:

# _external=True返回绝对地址:http://127.0.0.1:5000/static/css/styles.css
url_for('static', filename='css/styles.css', _external=True)

Flask-moment插件本地化日期和时间

引入并实例:

from flask.ext.moment import Moment
moment = Moment(app)

base.html中须要引入:

{% block scripts %}
{{ super() }}
{{ moment.include_moment() }}
{{ moment.lang('ja') }}
{% endblock %}

index.html中便可使用:

<p>The Local date and time is {{ moment(current_time).format('LLL') }}.</p>
<p>That was {{ moment(current_time).fromNow(refresh=True) }}</p>

除此以外Flask-Moment实现了moment.js中format(),fromNow(),fromTime(),calendar(),valueOf(),和unix()等方法。具体可参阅官方文档

Web表单

设置Flask-WTF插件

为免受跨站伪造请求CSRF的攻击,须要在app.config设置通用密钥以下:

app = Flask(__name__)
app.config['SECRET_KEY'] = 'do not guess this string'

其实配置密钥的变量保存在系统变量中比写在代码里更为安全。

字段类型 说明
StringField 文本字段
TextAreaField 多行文本字段
PasswordField 密码文本字段
HiddenField 隐藏文本字段
DateField 文本字段,值为datetime.date格式
DateTimeField 文本字段,值为datetime.datetime格式
IntegerField 文本字段,值为整数
DecimalField 文本字段,值为decimal.Decimal
FloatField 文本字段,值为浮点数
BooleanField 复选框
RadioField 一组单选框
SelectField 下拉列表
SelectMultipleField 下拉列表,可选择多个值
FileField 文本上传字段
SubmitField 表单提交
FormField 把表单做为字段嵌入另外一个表单
FormField 一组指定类型的字段

WTForms验证函数

验证函数 说明
Email 电子邮件地址
EqualTo 比较两字段值,经常使用于要求输入两次密码确认
IPAddress 验证IPv4网络地址
Length 验证输入字符串长度
NumberRange 验证输入的值在数字范围内
Optional 无输入值时跳过其余验证函数
Required 确保字段中有数据
Regexp 使用正则表达式验证输入值
URL 验证URL
AnyOf 确保输入值在可选值列表中
NoneOf 确保输入值不在可选值列表中
相关文章
相关标签/搜索