add_url_rule与app.route
add_url_rule(rule,endpoint=None,view_func=None)
这个方法用来添加
url
与视图函数的映射。
如果没有填写
endpoint
,那么默认会使用
view_func
的名字作为
endpoint
。
以后在使用
url_for
的时候,就要看在映射的时候有没有传递
endpoint
参
数,如果传递了,那么就应该使用
endpoint
指定的字符串,
如果没有传递,那么就应该使用
view_func
的名字。
def my_list():
return "我是列表页"
app.add_url_rule('/list/',endpoint='whuim',view
_func=my_list)
app.route
原理剖析
这个装饰器底层,也是使用
add_url_rule
来实现
url
与视图函数映射
的。
from flask import Flask,url_for
app = Flask(__name__) 45 @app.route('/',endpoint='index') 6 def index():
print(url_for('show'))
print(url_for('index'))
return "Hello"
def show_me():
return "这个介绍信息!!"
# endpoint 没有设置,url_for中就写函数的名字,如果
设置了,就写endpoint的值
app.add_url_rule('/show_me',view_func=show_m
e,endpoint='show')
# @app.route 底层就是使用的 add_url_rule
if __name__ =='__main__':
app.run(debug=True)
类视图
标准类视图使用步骤
1.
标准类视图,必须继承自
flask.views.View
2.
必须实现
dispatch_request
方法,以后请求过来后,都会执行这个方
法。
这个方法的返回值就相当于是之前的视图函数一样。也必须返回
Response
或者子类的对象,或者是字符串,或者是元组。
3.
必须通过
app.add_url_rule(rule,endpoint,view_func)
来做
url
与视图的映射。
view_func
这个参数,需要使用类视图下的
as_view
类方法类转换:
ListView.as_view('list')
。
4.
如果指定了
endpoint
,那么在使用
url_for
反转的时候就必须使用
endpoint
指定的那个值。如果没有指定
endpoint
,那么就可以使用
as_view(视图名字)
中指定的视图名字来作为反转。
from flask import Flask,url_for
from flask.views import View
app= Flask(__name__)
@app.route('/')
def index():
# print(url_for('mylist'))
print(url_for('my'))
return 'Hello'
class ListView(View):
def dispatch_request(self):
return '返回了一个List的内容!!' #
app.add_url_rule('/list',view_func=ListView.
as_view('mylist'))
app.add_url_rule('/list',endpoint='my',view_
func=ListView.as_view('mylist'))
# 用于测试
with app.test_request_context():
print(url_for('my'))
if __name__ =='__main__':
app.run(debug=True)
类视图的好处
1.
可以继承,把一些共性的东西抽取出来放到父视图中,子视图直
接拿来用就可以了。
2.
但是也不是说所有的视图都要使用类视图,这个要根据情况而
定。视图函数用得最多
类视图使用场景
from flask import Flask,render_template
from flask.views import View
app = Flask(__name__) 67 class BaseView(View):
def __init__(self):
self.msg = {
'main':'百战课程又更新了!!123'
}
class LoginView(BaseView):
def dispatch_request(self):
my_msg =
'神奇的登录功能'
self.msg['my_msg'] = '神奇的登录功能'
# return
render_template('login.html',msg=
self.msg.get('main'),my_msg = my_msg)
return
render_template('login.html',
**self.msg)
基于调度方法的类视图
class RegisterView(BaseView):
def dispatch_request(self):
self.msg['my_msg'] = '快捷的注册功能'
# return
render_template('register.html',msg=
self.msg.get('main'),my_msg = my_msg)
return
render_template('register.html',
**self.msg)
app.add_url_rule('/login',view_func=
LoginView.as_view('login'))
app.add_url_rule('/register',view_func=
RegisterView.as_view('register'))
if __name__ == '__main__':
app.run(debug=True)
基于调度方法的类视图
1.
基于方法的类视图,是根据请求的
method
来执行不同的方法的。
如果用户是发送的
get
请求,那么将会执行这个类的
get
方法。
如果用户发送的是
post
请求,那么将会执行这个类的
post
方法。其他
的
method
类似,比如
delete
、
put
2.
这种方式,可以让代码更加简洁。所有和
get
请求相关的代码都放
在
get
方法中,所有和
post
请求相关的代码都放在
post
方法中。就不
需要跟之前的函数一样,通过
request.method == 'GET'
装饰器
简言之,
python
装饰器就是用于拓展
原来函数功能
的一种函数,这
个
函数的特殊之处在于它的返回值也是一个函数
,
使用
python
装饰器的
好处
就是在不用更改原函数的代码前提下给函
数增加新的功能。
1.
在视图函数中使用自定义装饰器,那么自己定义的装饰器必须放
在
app.route
下面。
否则这个装饰器就起不到任何作用。
def login_required(func):
@wraps(func)
def wrapper(*arg,
**kwargs):
uname = request.args.get('uname')
pwd = request.args.get('pwd')
if uname == 'zs' and pwd == '123':
logging.info(f'{uname}:登录成功')
return func(*arg,
**kwargs)
else:
logging.info(f'{uname}:尝试登录,
但没成功')
return '请先登录'
return wrapper
@app.route('/settings/')
@login_requierd
def settings():
return '这是设置界面'
蓝图介绍
在
Flask
中,使用蓝图
Blueprint
来分模块组织管理。
蓝图实际可以理解为是存储一组视图方法的容器对象,其具有如下
特点:
1.一个应用可以具有多个
Blueprint
2.可以将一个
Blueprint
注册到任何一个未使用的
URL
下比如
“/user”
、
“/goods”
3.Blueprint
可以单独具有自己的模板、静态文件或者其它的通用操作方法,它并不是必须要实现应
用的视图和函数的
4.在一个应用初始化时,就应该要注册需要使用的
Blueprint
根据功能模块
根据技术模块
蓝图中模版文件
寻找规则
如果项目中的
templates
文件夹中有相应的模版文件,就直接使
用了。
如果项目中的
templates
文件夹中没有相应的模版文件,那么就
到在定义蓝图的时候指定的路径中寻找。
并且蓝图中指定的路径可以为相对路径,相对的是当前这个蓝图文件所在的目录
常规:蓝图文件在查找模版文件时,会以templates为根目录进行
查找