vlambda博客
学习文章列表

Flask干货:Flask视图高级技术(一)



Flask干货:Flask视图高级技术(一)


图 | 源网络
文 | 5号程序员



01


众所周知,上网是需要网址的,比如百度(www.baidu.com)、知乎(www.zhihu.com)。


通过前面的学习,我们的电脑也能变成一个服务器,而且网址为http:// http://127.0.0.1:5000/。现在假设我们要新建一个网站,而且网页有很多个,那我们要如何管理、存放并给网页指定网址呢?


哈,当然有办法,而且我们之前已经用过了,app.route。


在Flask应用中,路由是指用户请求的URL与视图函数之间的映射,处理URL和函数之间关系的程序称为路由。


Flask框架根据HTTP请求的URL在路由表中匹配预定义的URL规则,找到对应的视图函数,并将视图函数的执行结果返回给路由器。




02


app.route的使用


在Flask框架中,默认是使用@app.route装饰器(前面已经用过了)将视图函数和URL绑定的。


Flask干货:Flask视图高级技术(一)


上述代码中,有两个视图函数index()和product(),使用app.route装饰器能将URL和执行的视图函数关系保存到app.url_map属性上。


对于视图函数index(),代码将URL ’/’与其绑定,所以在使用时输入http:// http://127.0.0.1:5000/就能显示其内容,也就是主页面;

product()的绑定同理,输入http:// http://127.0.0.1:5000/product就能显示其内容,相当于是子页面。



03


add_url_rule的使用


除了使用@app.route装饰器,我们还可以使用add_url_rule来绑定视图函数和URL,先看下面的代码:

from flask import Flask,url_for
app = Flask(__name__)@app.route('/')def index(): return "Hello World!"
def my_test(): return "这是一个测试页!"app.add_url_rule('/test/', endpoint='my_test', view_func=my_test)
if __name__ == "__main__": app.run(debug=True)

网页中显示:

Flask干货:Flask视图高级技术(一)


Flask干货:Flask视图高级技术(一)

代码中使用add_url_rule()函数将视图函数和URL绑定,即把路由“/test/”和视图函数my_test()进行绑定。


在add_url_rule()函数中,涉及三个参数:

rule:设置的URL。

endpoint:给URL设置的名称。

view_func:指定视图函数的名称。


因此,我们稍做改动:

def my_test(): return "这是一个测试页!"app.add_url_rule('/test/', endpoint='test', view_func=my_test)

代码中endpoint只是指定了此URL的名称,view_func里面指定视图函数的名称。


如果已经指定了endpoint,url_for指定的时候就不能用视图函数的名称了,而是用endpoint的名称;也就是说如果想用url_for反转,只能用url_for(endpoint)。


这里看起来比较复杂,用下面的例子看一下就会比较清楚:

from flask import Flask,url_for
app = Flask(__name__)@app.route('/')def index(): return "Hello World!"
def my_test(): return "这是一个测试页!"app.add_url_rule('/test/', endpoint='test', view_func=my_test)
with app.test_request_context(): #构建一个虚拟的请求上下文环境 print(url_for('test'))
if __name__ == "__main__": app.run(debug=True)

可以看到,“/test/”被打印在命令行中:


Flask干货:Flask视图高级技术(一)


endpoint给设定的URL“/test/”取了个名字。


04


实际上,在简单的操作中endpoint的值并不影响功能,但 Flask是通过endpoint找到视图函数的,就像一个查找编号,能够找到指定的URL,有了它会更方便、更清楚。关于app.route与add_url_rule就介绍到这里,内容比较简单,下一次我们将详细说说 Flask类视图。

你确定不 关注我一波?!


Flask干货:Flask视图高级技术(一)


- END -