一、flask的路由装饰器
app = Flask(__name__)
@app.route("/", methods=['get', 'post'])
def fun():
return "hello world"
上面的代码时flask的视图函数,由@app.route("/", methods=[‘get’, ‘post’]),来控制访问路径,源码如下:
def route(self, rule, **options):
def decorator(f):
endpoint = options.pop("endpoint", None)
本质 self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator
看到源码,其中执行了self.add_url_rule(rule, endpoint, f, **options)函数,可以看出只要执行了这个方法,就可以添加访问路径。
二、app.route()的参数
-
rule
路径规制 -
endpoint=""
默认是函数名, 可以在app.route()的关键字参数中定义url_for("") 反向地址, 通过视图函数名, 或endpoint解析对应的URL -
methods=[]
该视图函数能处理的请求方式, 默认是GET, 当重新定义了
methods, 那么默认的GET也会被覆盖 -
defaults={}
给视图函数传递参数, 可以作为默认参数, 传了就必须的接 -
strict_slashes=Bool
严格的使用"/", URL中没有"/", 访问时也不能有, URL中有"/", 你访问时没有, 会通过301进行永久重定向 -
redirect_to=""
永久重定向
三、常用的路径
@app.route('/user/<username>') 传递字符串
@app.route('/user/<int:id>') 传递整数
@app.route('/user/<float:id>') 传递浮点数
@app.route('/user/<path:path>') 传递路径
尖括号中的值,视图函数可以从路径中获取相应的值
四、自定义传参规制
a.创建类并继承BaseConverter,实现to_python方法
b.把自定义的类添加进app.url_map.converters字典中
c.然后自己就可以使用自定义的路径
例如:
from flask import Flask
from werkzeug.routing import BaseConverter
class RegexConverter(BaseConverter):
def __init__(self, maps, regex):
super(RegexConverter, self).__init__(maps)
self.regex = regex
def to_python(self, value):
"""
路由匹配时,匹配成功后传给视图函数中的参数
:param value:
:return:
"""
return value
def to_url(self, value):
val = super(RegexConverter, self).to_url(value)
return val
app = Flask(__name__)
app.url_map.converters['re'] = RegexConverter
这样就可以使用名为re的路径
@app.route("/…/<re(‘参数’):nid>")
其实这是自定义的以正则匹配的字符串,使得其传入视图函数
五、flash()方法和get_flashed_messages()方法
- flash()
这是基于session的,能够存储数据的方法,可以进行分类存储
flash(message, category=“message”)
可以使用category参数进行分类 - get_flashed_messages()
这是将使用flash()方法存入的数据全部取出或按照某类的全部数据取出
get_flashed_messages(with_categories=False, category_filter=())
可以按照分类进行获取数据
六、before_request,after_request等装饰器
1.使用 @app.before_request 装饰器装饰的函数,可以在每一次请求之前执行该函数(相当与检测)
2.如果有返回值,则表示被拦截了
3.如果没有返回值,则表示通过检测了
4.简单使用:用户认证
5.使用 @app.after_request 装饰器装饰的函数,可以在每一次请求之后执行,该函数必须要有response参数,必须要返回response
6.可以写多个这样的函数,@app.before_request 装饰的函数,顺序执行,@app.after_request 装饰的函数
倒序执行
7.请求拦截后,所有的 @app.after_request 装饰的函数都会执行
8.定制错误信息 使用 @app.errorhandler([状态码]) 装饰器来定制错误信息
9.使用 @app.template_filter @app.template_global 装饰器装饰的函数,可以在页面中调用
七、中间件
# -*- coding:utf-8 -*-
from flask import Flask
# 实例化flask对象
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'hello world!'
class md(object): # 中间件
def __init__(self, old_wsgi_app):
self.old_wsgi_app = old_wsgi_app
def __call__(self, *args, **kwargs):
print("开始之前")
ret = self.old_wsgi_app(*args, **kwargs)
print("结束之后")
return ret
if __name__ == '__main__':
# 监听用户请求
# 如果用户请求到来。执行app的__call__方法
app.wsgi_app = md(app.wsgi_app)
app.run()
将Flask实例化对象中的wsgi_app函数重写,可以在其中写入自己的想要执行的代码,能够在启动之前和之后执行。