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 最多的就是获取注册网站URLurl_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路由的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段11——vue路由的配置

flask源代码笔记——路由

flask源代码笔记——路由

Flask系列 路由系统

Flask路由之重定向

flask路由规划蓝图和route