Flask中的路由

查看整个flask中的路由映射关系 app.url_map

from flask import Flask

app = Flask(__name__)

@app.route("/index")
def index()
return "flask index page" if __name__ == "__main__":
print(app.url_map)
app.run() # 下面是打印效果
'''
Map([<Rule '/index' (OPTIONS, HEAD, GET) -> index>,
<Rule '/static/<filename>' (OPTIONS, HEAD, GET) -> static>])
'''

打印的效果是一个列表,里面包含着一个一个路由规则,拿出一条解析

<Rule '/index' (OPTIONS, HEAD, GET) -> index>

rule : 规则的意思

'/index' : 这个就是访问的路径,也就是url

(OPTIONS, HEAD, GET) : 允许的请求方式

index : 对应的视图函数

代码块一:
@app.route("/index")
def index()
return "flask index page"

按照这样的例子来写,我们就实现了一个url和视图函数的对应关系,去看看route()这个方式都做了什么

代码块二:
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

首先看这行代码 @app.route("/index")

route 它是一个方法对吧,那么route("/index") 它加了括号,是不是表示在我们执行falsk程序的时候,就会调用,那它的返回值就应该就是一个函数的内存地址,也就是源码中的decorator函数的内存地址,那么代码块一不是可以更换为这样的形式

代码块三
@decorator
def index():
return "flask index page"

继续看这段代码,一个装饰器对吧,会将@decorator下一行的函数(index)的内置地址当作参数传递到函数中,看代码块二中的decorator函数都做了一些什么,decorator函数最终还是返回了参数f,这个参数f就是代码块三中的index函数对吧,那在retuen之前还做了什么呢?也就是这两行代码endpoint = options.pop('endpoint', None) , self.add_url_rule(rule, endpoint, f, **options), 那我们继续分析吧

endpoint = options.pop('endpoint', None) 这行代码中的options就是一个字典,使用了pop方法,那么这个字典是怎么得到的呢?看代码块二那段源码,有一个**options它和**kwargs是一个意思,是一个字典。那么route这个方法的参数传递方式应该是这样了 route(rule,k1=v1,k2=v2)

self.add_url_rule(rule, endpoint, f, **options) 这行代码才是最主要的地方,就是这行代码将视图函数和url之前相互对应起来。它的参数我应该不用再细说了,我们看add_url_rule方法做了什么

算了,源码我就不讲了,有兴趣的话可以自己去阅读下,这个方法主要就是帮我们在url和视图函数之间做了对应关系,那么decorator这个函数也就是代码二,它没有对我们的视图函数做处理,就返回了,也就多执行了add_url_rule这个方法对吧

# 为创建视图函数和url之间的对应关系的主要代码就是 add_url_rule
# 那么我们除了代码块一那种方式创建关系,下面这段代码也可以达到效果 from flask import Flask app = Flask(__name__) def index()
return "flask index page" app.add_url_rule("/",view_func=index) if __name__ == '__main__':
app.run()
# 这样的格式呢,在方法add_url_rule的注释中也提到了

好了,对于通过使用装饰器实现url和视图函数的对应关系的分析就结束了

我们回到app.url_map的的打印结果来看,里面一个允许求情的方式

@app.route('/index')
def index ():
return "index page"

这段代码我根本没有指定允许请求的方式,那么它允许的方式默认为GET方式,这时候向这个url发起POST请求,会报错,说该请求方式不允许

为视图函数设置允许请求方式:app.route('/index',methods=['GET','POST'])methods它是一个列表,请求方法不区分大小写,他会同一为你upper(),

我们在看decorator这个函数,也就是代码块二中的内容

def decorator(f):
endpoint = options.pop('endpoint', None)
self.add_url_rule(rule, endpoint, f, **options)
return f

其中有一个这个endpoint , 它代表什么呢?它就是为视图函数命别名,如果你不传的话,那么endpoint的值就是None,最终在add_url_rule 会进行判断endpoint是否为true,不是的话,会将视图函数的__name__ 的值传递给endpoint。最终我们可以通过反向查找endpoint的值去找到对应的url。

url_for 这个就是反向查找的方法,通过 from flask import url_for去导入,下面写一段代码演示下

from flask import Flask,url_for,redirect

# redirect是页面重定向的,后面我会继续更新 

app = Flask(__name__)

@app.route("/register",endpoint='register')
def register():
'''访问register之后,重定向到login页面'''
url = url_for(login)
return redirect(url) @app.route('/login',endpoint='login')
def login():
return "login page" if __name__ == "__main__":
app.run()

使用endpoint的好处是:不管/login怎么变,使用url_for(login) 就能拿到登陆页面的url。

看这个url/goods , 这是一个获取商品页面的url,那我想获取某一个商品的页面,这个url怎么设计呢?

  1. ulr?goods_id = 1 这样的方式请求,实现起来很容易
  2. /goods/1 这里的1就是商品的id,那么是多变的对吧,所以必须找到设计出这样的url,/goods/商品的id

这里需要用到flask提供的转换器:

default string any path int float uuid 就这几个自带的

@app.route('/goods/<int:goods_id>',methods=["GET"])
def goods(goods_id):
print(goods_id)
return "goods page {}".format(goods_id) # 注意goods函数必须传递参数,参数名要与转换器后面的值一样,比如这里的goods_id
# 上面的几个转换器可以去自行了解下,看名字大概就知道怎么使用了
# 除了flask自带的转换器,我们也可以自定义转换器。
# 这时别人写的博客,可以去了解:https://www.cnblogs.com/serpent/p/9575179.html

最新文章

  1. C#异常处理性能测试
  2. MVC之前的那点事儿系列(2):HttpRuntime详解分析(上)
  3. mysql5.5手册读书日记(3)
  4. iOS开发-【C语言】三目运算符
  5. 《Out of control》阅读笔记(一)
  6. 创建App IDs时选择App ID Prefix才能勾选push notifications
  7. Ubuntu下codeblocks汉化
  8. 2015上海网络赛 A Puzzled Elena
  9. Visual Studio 2013 无法启动 IIS Express 的解决办法
  10. C#静态构造函数和析构函数片段化认知
  11. 如何对Site Settings页面进行定制化 添加一个setting 链接
  12. java解析上传的excel
  13. golang struct
  14. 网卡最大传输单位MTU和巨型帧(Jumbo frame)设置
  15. Spring Boot 2集成Redis
  16. Percona XtraDB Cluster vs Galera Cluster vs MySQL Group Replication
  17. 以添加评论组件为例看angular2请求数据的处理
  18. ionic 2,带着运气成分
  19. js array数组对象操作方法汇总
  20. flex 自定义组件的编写

热门文章

  1. Maven入门之简介与安装
  2. 一个简单问题引发对IEnumerable和IQueryable的思考
  3. java面试知识
  4. 服务器word权限添加
  5. Spring @Resource, @Autowired and @Inject 注入
  6. null 和 undefined 区别
  7. Android activity跳转并且回调
  8. 【Linux】GCC编译
  9. 《ArcGIS Runtime SDK for Android开发笔记》——(11)、ArcGIS Runtime SDK常见空间数据加载
  10. EJB是什么?