Flask路由
Posted Flask学习笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask路由相关的知识,希望对你有一定的参考价值。
视图路由
1.app.route()
视图函数
app.route()
的实现依赖的是装饰器函数,其本质是函数的闭包.自定义一个视图函数,最简单的如:
@app.route()
def index():
return 'hello world'如果你使用的是
pycharm
直接选中app.route()
,然后ctrl+B
来查看源代码,可以清楚的看到他是一个函数的闭包.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所以,我们完全也可以通过函数的闭包的实现方法来实现要访问的注册网址
def login():
return 'my define login'
app.route('/login/')(login)访问网站:
http://127.0.0.1:5000/login/
,正常访问,没有任何报错.
2.关于endpoint
endpoint
定义:the endpoint for the registered URL rule. Flask itself assumes the name of the view function as endpoint
endpoint: 指的是注册网站的节点如果不写,默认是函数的名称而使用
endpoint
最多的就是获取注册网站URL
的url_for(endpoint, **args)
, 需要注意的是app.route()
根据定义是可以添加endpoint
值的.当值没定义的时候,使用的是函数的名称,值有定义,必须使用定义值.@app.route('/endpoint/', endpoint='My_define_rule')
def get_endpoint():
"""使用 url_for 来获取网站的注册路径 """
error_information = None
# 没有定义endpoint 默认使用的是函数的名称,
register_url_1 = url_for('index')
# 定义了endpoint 使用的定义的值
try:
register_url_2 = url_for('get_endpoint')
except Exception as e:
error_information= e
register_url_2 = url_for('My_define_rule')
return 'register_url_1:' + register_url_1 + ',register_url_2:'+ register_url_2 + \
',url_for(get_endpoint):' + str(error_information)访问网站
127.0.0.1/endpoint/
可以获取以下信息,register_url_1:/,register_url_2:/endpoint/,url_for(get_endpoint):Could not build url for endpoint 'get_endpoint'. Did you mean 'real_define_user' instead?
定义了
endpoint
而不使用,就会返回报错.
3.app.add_url_rule()
像上面一样,查看
app.route
的源码就会知道,他的底层是通过app.add_url_rule()
来实现的.def add_url_rule(
self,
rule,
endpoint=None,
view_func=None,
provide_automatic_options=None,
**options
):同样的,我们也可以通过
app.add_url_rule()
来注册网址:# 定义一个函数
def my_define_user():
return "my_define_user"
# 将函数注册到网站,注意这里的 endpoint ,可写可不写,如果写了,就需要注意 url_for() 中的写法
app.add_url_rule('/user/', endpoint='real_define_user', view_func=my_define_user)
4.测试文件
from flask import Flask,url_for
app = Flask(__name__)
@app.route('/')
def index():
return "Hello World"
"""
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
"""
def login():
return 'my define login'
app.route('/login/')(login)
# 关于endpoint
# the endpoint for the registered URL rule. Flask itself assumes the name of the view function as endpoint
# endpoint 注册网站的节点,如果不写,默认是函数的名称
@app.route('/endpoint/', endpoint='My_define_rule')
def get_endpoint():
"""使用 url_for 来获取网站的注册路径 """
error_information = None
# 没有定义endpoint 默认使用的是函数的名称,
register_url_1 = url_for('index')
# 定义了endpoint 使用的定义的值
try:
register_url_2 = url_for('get_endpoint')
except Exception as e:
error_information= e
register_url_2 = url_for('My_define_rule')
register_url_3 = url_for('real_define_user')
return 'register_url_1:' + register_url_1 + ',register_url_2:'+ register_url_2 + \
',url_for(get_endpoint):' + str(error_information) + 'my_define_user:' + register_url_3
def my_define_user():
return "my_define_user"
app.add_url_rule('/user/', endpoint='real_define_user', view_func=my_define_user)
"""
def add_url_rule(
rule,
endpoint=None,
view_func=None,
provide_automatic_options=None,
**options
):
"""
if __name__=='__main__':
app.run(debug=True)
以上是关于Flask路由的主要内容,如果未能解决你的问题,请参考以下文章