当前位置: 代码迷 >> 综合 >> Flask 视图的高级技术
  详细解决方案

Flask 视图的高级技术

热度:80   发布时间:2024-03-07 00:56:47.0

 

1.app.route和add_url_rule 的简介

说明:

在Flask中,路由是用户指定请求的URL与视图函数之间映射,处理url和函数之间的关系称之为路由,Flask根据HTTP请求的URL在路由表中匹配预定义的URL规则,找到对应的视图函数,并将视图函数执行的结果返回给服务器。

1.app.route()的使用

示列:

@app.route('/')
def hello_world():return render_template('base.html')

2.add_url_rule()的使用

from flask import Flask
app=Flask(__name__)
@app.route('/')
def index1():return '我是地球人'
def hello_word():return '我是火星人'
app.add_url_rule('/test/',endpoint='my_test',view_func=hello_word)
if __name__ == '__main__':app.run(debug=True)

解析:使用app.add_url_rule()函数进行视图函数和URL的绑定,这里将路由‘/test/’和视图函数‘hello_word()’函数进行了绑定。

  • rule:设置的URL
  • endpoint:给URL设置的名称
  • view_func:指定视图函数的名称

注意:Flask是通过endpoint找到viewfunction视图函数的。

 

2.Flask 类视图 

说明:视图函数也可以基于来实现,类视图的好处是支持继承,编写完类视图需要通过app.add_url_rule(url_rule,view_func)来进行注册。Flask类视图分为标准类视图和基于调度方法的类视图。

1.标准类视图

标准类视图的特点:

  • 必须继承flask.views.View。
  • 必须实现dispatch_reuquest 方法,以后请求过来后,都会执行这个方法,这个方法的返回值相当于之前的视图函数,也必须返回Response 或者子类的对象,或者是字符串和元组。
  • 必须通过app.add_url_rule(rule,endpoint,view_func)来做url与视图函数的映射,view_func参数需要使用as_view类方法转换
  • 如果指定了endpoint,那么url_for反转时候要必须通过endpoint指定的那个值,如果没有指定endpoint,那么就可以使用as_view视图名称中指定的视图名称来做为反转。

注意:

使用类视图的好处是支持继承,可以把一些共性的东西放在父类,其他子类可以继承,但是类视图不能和视图函数一样,写完类视图西药使用app.add_url_rule()进行注册。

示列:

from flask import Flask,render_template,views
app=Flask(__name__)
class Ads(views.View):def __init__(self):super(Ads, self).__init__()self.dicks={'ads':'这是对联广告'}class index2(Ads):def dispatch_request(self):return render_template('login.html',**self.dicks)class index3(Ads):def dispatch_request(self):return render_template('name.html',**self.dicks)class index4(Ads):def dispatch_request(self):return render_template('hello.html',**self.dicks)app.add_url_rule(rule='/',endpoint='test',view_func=index2.as_view('index2'))
app.add_url_rule(rule='/in/',endpoint='tests',view_func=index3.as_view('index3'))
app.add_url_rule(rule='/is/',endpoint='testa',view_func=index4.as_view('index4'))
if __name__ == '__main__':app.run(debug=True)

创建的HTML文档

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
这是首页 {
   { ads }}
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
这是登录页面 {
   { ads }}
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
这是注册页面 {
   { ads }}
</body>
</html>

基于方法的类视图

说明:

Flask提供了另外一种视图flask.views.MethodView,对每个HTTP方法执行不同的函数(映射到对应方法的小写的同名方法上)。

from flask import Flask,render_template,views,request
app=Flask(__name__)
@app.route('/',methods=['get','post'])
def fun():return render_template('hello.html')
class Ads(views.MethodView):def get(self):return render_template('hello.html')def post(self):username=request.form.get('username')password=request.form.get('password')if username == 'adin' and password == 'adin':return '用户名正确可以登录'else:return '用户名或者密码错误重新登录'
app.add_url_rule('/login',view_func=Ads.as_view('Ads'))
if __name__ == '__main__':app.run(debug=True)

创建一个HTML文档

<form action="/login" method="post">
用户名<input name="username"type="text">密码<input name="password" type="password">登录<input name="denglu"type="submit"value="登录">
</form>

注意:类中的get方法和post 方法不能改名字,是重写。

3.蓝图

说明:

蓝图的定义,在蓝图被注册到应用之后,所要执行的操作集合,当分配请求时,Flask会把蓝图和视图函数关联起来。并生成两个端点之前的URL

示列:

from flask import Flask,render_template,views,request
import news,proect
app=Flask(__name__)
@app.route('/')
def hello_word():return  'hello my word'
app.register_blueprint(news.news_list)   #将News模块里面的蓝图对象news_list注册到app
app.register_blueprint(proect.proect)    #将proect模块里面的蓝图对象proect注册到app
if __name__ == '__main__':app.run(debug=True)

创建一个分路由视图函数

from flask import Blueprint
news_list=Blueprint('news',__name__)  
"""
创建一个Blueprint对象,第一个参数可以看成是这个对象的名字。
"""
@news_list.route('/news')    #将蓝图对象当作app那样使用
def new():return '这是一个模块页面'

创建一个分路由视图函数 


from flask import Blueprint
proect=Blueprint('txt',__name__)
@proect.route('/txt')
def pro():return '这又是另外一个模块'

解析:蓝图的目的是实现各个模块的视图函数写在不同的py.文件中,在主视图中导入分路由视图模块,并且注册成蓝图对象。