-
flask 转换器默认6个
-
flask将session数据保存到了哪里
-
如果需要吧session信息存储到数据库中,需要使用扩展包 flask-session;
1.处理请求
-
1.URL路径参数:url路径的一部分
- 转换器:语法<>
- 源码说明:正则实现
import re # 返回:布尔值,True和False,match方法调用一次,编译一次 re.match('1[3-9]..',mobile) # 返回:正则表达式编译的对象,compile方法编译一次,多次使用,效率相对更高 rule_re = re.compile(字符串)
# 示例:url路径参数中的手机号
http://127.0.0.1:5000/users/13012345678
# 查询字符串:问号后面、等号传值、与号分隔
http://127.0.0.1:5000/?mobile=13012345678&user_id=2019
# 定义视图
@app.route('/users/<mobile>')
def get_mobile(mobile):
print('mobile={}'.format(mobile))
return 'hello world'
- 自定义转换器:
# 自定义转换器:内置转换器不满足需求时,可以自定义,参考源码实现
# 步骤:
# 1.定义类
# 2.继承自BaseConverter
# 3.定义正则表达式
# 4.把自定义的转换器,添加到默认转换器字典中
class MobileConverter(BaseConverter):
regex = '1[3-9]\d{9}'
app.url_map.converters['mobile'] = MobileConverter
@app.route('/<mobile:data>')
def get_mobile(data):
print("mobile={}".format(data))
return 'hello mobile {}'.format(data)
- 2.处理请求request对象:args/form/method/url/headers/files
@app.route('/',methods=['POST','GET'])
def index():
# 1-----args查询字符串,多个同名参数取第一个。
# mobile = request.args.get('mobile')
# print('mobile={}'.format(mobile))
# user_id = request.args.get("user_id")
# print("mobile={},user_id={}".format(mobile,user_id))
# 2-----form表单
# user = request.form.get('user')
# pswd = request.form.get('pswd')
# print(user,pswd)
# 3-----method和url
# print('*'*50)
# print(request.method)
# print(request.url)
# print('*'*50)
# 4-----headers表示报文头
# User-Agent=你是谁?
# Host=到哪去?
# Referer=从哪来?可以用来CSRF防护,不可以只使用referer。
# Host: 127.0.0.1:5000
# Connection: keep-alive
# Cache-Control: max-age=0
# Upgrade-Insecure-Requests: 1 # 升级不安全请求,如果是http协议,默认加上https
# User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
# Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
# Accept-Encoding: gzip, deflate, br
# Accept-Language: zh-CN,zh;q=0.9,zh-TW;q=0.8,en;q=0.7,pt;q=0.6,fr;q=0.5
# print('*'*50)
# print(request.headers)
# print('*'*50)
# 5-----files属性:获取文件
# print(request) # 对象
image = request.files.get("image")
# data = image.read()
# with open('666.jpg','wb') as f:
# f.write(data)
image.save('./666.png')
return 'hello world'
2.处理响应
- 模板:render_template(模板文件名)
- 重定向:redirect(url地址)
- json:摘森,实现跨语言、跨平台的数据交互。
- jsonify函数:不仅会返回json数据,会把响应的类型改成application/json
- json模块:
- 1.dumps(python类型转json)和loads(json转python类型):操作的是变量,在内存中;
- 2.dump和load:操作的是文件,在硬盘中;
- 返回元组:自定义响应状态码、响应头信息
作业:Flask中能不能返回数值、列表、字典?
3.cookie和session
- cookie:状态保持的一种方案(key/value形式),key/value存储在浏览器中,不安全,大小、数量有限制。
- session:状态保持的一种方案(key/value形式),value存储在服务器中,key存在浏览器的cookie中;
4.异常处理
- abort函数,参数是http异常状态码(4xx,5xx),作用终止视图的执行,类似于python中的raise语句
- 工程开发中,abort一般会配合errorhandler一起使用,自定义错误信息,提高用户体验。
5.请求钩子
- 4个请求钩子,2种形式:
- 请求前执行:
- 1.before_first_reqeust:在第一个请求前执行,执行一次
- 2.before_request:每个请求前执行,执行多次
- 请求后执行:
- 1.after_request:在没有错误的情况下,请求后执行,必须接受响应(视图return返回的数据)作为参数,并返回响应;
- 2.teardown_request:在有错误的情况下,请求后执行,必须接受错误信息作为参数
作业:请求钩子,请求后执行的2个钩子所谓的异常是指什么异常?
6.上下文
-
请求上下文:
- request:封装了HTTP请求的内容,针对的是http请求
- session:用来记录请求会话中的信息,针对的是用户信息
-
应用上下文:
- current_app:程序实例app的代码,可以获取程序的配置信息,app的属性信息等,在不方便直接使用app的时候,可以使用current_app;
- g:在一次请求过程中,不同函数之间传递数据
# python中不同函数之间传递数据,需要定义参数 def fun1(): pass def fun2(args): pass f1 = fun1() fun2(f1) # 不同函数之间传递数据,不需要定义参数,使用g对象 def db_query(): # 使用g对象,获取数据 print('g.user_id={},g.user_name={}'.format(g.user_id,g.user_name)) @app.route('/') def index(): # 使用g对象,定义数据 g.user_id = 2019 g.user_name = 'itcast_python29' db_query() return 'hello world'
7.综合案例:认证机制
- 需求:web网站有很多页面,有些页面任何人都能访问,有些页面需要具备某种权限才能访问。
- 原理:
- 1.在每次请求前,尝试获取用户信息
- 2.如果满足条件,运行进入视图,否则,不允许
- 代码思路:首页和个人信息页
- 1.before_request请求钩子,实现尝试获取用户信息,True或False
- 2.如果True,允许进入首页和个人信息页,否则,只能允许进入首页
- 3.可以把判断的功能,封装到装饰器中,需要具备权限才能访问的视图,加上装饰器,否则不加(不改变原有代码的前提下,添加新的功能代码)。
8.手动开启上下文
- 应用上下文:with app.app_context()
- 请求上下文:with app.request_context()