Flask 视图的高级技术

it2023-10-15  65

 

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:设置的URLendpoint:给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.文件中,在主视图中导入分路由视图模块,并且注册成蓝图对象。

 

 

 

 

 

 

最新回复(0)