day2
正则匹配路由
具体实现步骤为:
-
导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录
from werkzeug.routing import BaseConverter -
自定义转换器:自定义类继承于转换器基类
class RegexConverter(BaseConverter): def __init__(self,url_map,*args): super(RegexConverter,self).__init__(url_map) # 将接受的第一个参数当做匹配规则进行保存 self.regex = args[0] -
添加转换器到默认的转换器字典中
app = Flask(__name__) # 将自定义转换器添加到转换器字典中,并指定转换器使用时的名字随意指定(re) app.url_map.converters["re"] = RegexConverter -
使用自定义转换器实现自定义匹配规则
# 匹配一个三位数字
@app.route('/user/<re("[0-9]{3}"):user_id>')
def user_info(user_id):
return "user_id:%s" % user_id
如果访问的url不符合规则,会提示找不到页面
to_python和to_url
继承于自定义转换器之后,还可以实现 to_python 和 to_url 这两个函数去对匹配参数做进一步处理
to_python
class RegexConverter(BaseConverter):
def __init__(self,url_map,*args):
super(RegexConverter,self).__init__(url_map)
# 将接受的第一个参数当做匹配规则进行保存
self.regex = args[0]
def to_python(self,value):
return int(value)
value值代表匹配到的值,匹配完成之后,对匹配到的参数做最后一步处理再返回
to_url
在使用 url_for 去获取视图函数所对应的 url 的时候,会调用此方法对 url_for 后面传入的 视图函数参数 做进一步处理
系统自带转换器
DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
}
异常捕获
HTTP异常主动抛出
abort方法:抛出一个给定状态代码。如:abort(404)
抛出的状态码,只能是 HTTP协议的错误状态码
捕获错误
errorhandler 装饰器:当程序抛出指定错误状态码的时候,就会调用该装饰器所装的方法
@app.errorhandler(404)
def not_found(e):
return "页面去哪了???哈哈"
捕获指定异常
@app.errorhandler(ZeroDivisionError)
def zero_division_error(e):
return "除数不能为0"
请求勾子
-
before_first_request
-
在处理第一个请求前执行
# 在第一次请求qian执行 @app.before_first_request def before_frist_request(): print("第一次请求时自动执行")
-
-
before_request
- 在每次请求前执行
- 如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
# 每次请求前都会执行 @app.before_request def before_request(): print("每次请求之前都会执行") # 如果return 则不会执行请求的视图函数 -
after_request
- 如果没有抛出错误,在每次请求后执行
- 接受一个参数:视图函数作出的响应
- 在此函数中可以对响应值在返回之前做最后一步修改处理
- 需要将参数中的响应在此参数中进行返回
# 每次请求后都会执行 @app.after_request def afteer_request(response): print("每次请求之后都会执行") print(response) return response -
teardown_request:
- 在每次请求后执行
- 接受一个参数:错误信息,如果有相关错误抛出
- (为什么打印参数,并没有打印出来错误信息)
from flask import flask
from flask import abort
app = Flask(__name__)
# 在第一次请求之前调用
@app.before_request
det before_first_request():
print("before_first_request")
# 每一次请求之前调用
@app.before_request
def before_request():
print("before_request")
# 在执行完视图函数之后调用,并且在函数里面接收一个参数:响应,可以在此方法中对相应做最后一步处理
@app.after_request
def after_request(response):
print("after_request")
response.headers["Content-Type"] = "application/json"
return response
# 在请求之后都会执行,如果请求的函数报异常,会把具体异常传入到此函数
@app.teardown_request
def teardown_request(error):
print("teardown_request")
@app.route('/')
def index():
return "index"
if __name__ == '__main__':
app.run(debug=True)
request
data 记录请求的数据
form 记录请求中的表单数据
args 记录请求中的查询参数
cookies 记录请求中的cookie信息
headers 记录请求中的报文头
method 记录请求使用的 HTTP方法
url 记录请求的url地址
files 记录请求上传的文件
状态保持
http是一种无状态协议,请求是无状态的。
实现状态保持的两种方式
在客户端存储信息使用 Cookie
在服务器端存储信息使用 Session
cookie
设置cookie,通过响应带给浏览器
获取cookie ,从请求中获取
cookie是存储在浏览器中的纯文本信息,由服务端生成。浏览器只能保存4kb的内容
设置cookie
from flask import Flask
from flask import make_response
from flask import request
# 设置响应报文
sesponse = make_response("响应体内容")
# 设置cookie
response.set_cookie("key","value",max_age=3600)
return response
删除cookie
# 删除cookie
@app.route('/logout')
def logout():
response = make_response('删除成功')
response.delete_cookie("user_id")
return response
session
session依赖于cookie
设置session
# 配置
app.config["SECRET_KEY"] = "XXX"
# 设置session
session["user_id"] = '1'
# 获取
user_id = session.get("user_id",'')
上下文
上下文:相当于一个容器,保存了flask运行过程中的一些信息。请求上下文和应用上下文。
请求上下文:request 和 session 。只能在请求过程中使用,及在视图函数中使用。
应用上下文:current_app 和 g 。在应用运行之后才能使用。current_app可以代替app,一般在其他模块中使用,避免运行时导入模块循环。
flask-script
先安装包 命令行输入 pip install flask-script
导入
from flask_script import Manager
manager = Manager(app)
manager.run()
运行
python 路径/文件.py runserver -p 端口 -d (debug)
本文是关于Flask框架的第二天学习内容,涵盖了正则匹配路由,包括自定义转换器及其`to_python`和`to_url`方法,HTTP异常捕获与处理,请求钩子的使用,以及状态保持的实现,如cookie和session的管理。此外,还介绍了Flask的上下文概念以及如何使用flask-script扩展。
1313

被折叠的 条评论
为什么被折叠?



