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