1 应用请求和上下文
想要让视图函数访问请求对象,一种就是作为参数传入,但是这样导致视图函数出现一个参数,如果要访问其他对象就会乱了,因此我们需要使用flask中的上下文特定的变量在一个线程中的全局变量可访问,切不会干扰其他线程,看下面代码示例:
from flask import request,Flask
app = Flask(__name__)
@app.route('/login',methods=['GET','POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
这个视图函数将request当做全局变量使用,事实上,request是不可能全是全局变量里的,每个线程的请求对象不同
flask的上下文有两种:应用上下文,请求上下文
应用上下文有current_app、g两种变量
请求上下文有request、seesion变量
current_app 是当前应用的应用实例:可以用来访问当前应用的上下文信息和配置信息:
from flask import Flask, current_app
app = Flask(__name__)
@app.route('/')
def index():
# 访问当前应用的配置信息
debug = current_app.config['DEBUG']
# 输出调试模式状态
return '<p>Debug mode is: {}</p>'.format(debug)
获取上下文信息:
from flask import Flask, current_app
app = Flask(__name__)
@app.route('/')
def index():
# 访问请求 URL
request_url = current_app.request.url
# 输出请求 URL
return '<p>Request URL is: {}</p>'.format(request_url)
if __name__ == '__main__':
app.run()
g变量呢是作为请求时临时储存的对象,每次请求的都会重设这个变量,下面是一个使用举例:
from flask import Flask, g
app = Flask(__name__)
@app.route('/')
def index():
# 在请求开始时,g变量是是否存在my_data属性,一开始g变量为空的
if not hasattr(g, 'my_data'):
# 如果不存在,则在 g 变量中存储数据
g.my_data = 'Hello, World!'
# 访问存储在 g 变量中的数据
data = g.my_data
return '<p>{}</p>'.format(data)
request变量这里就不在赘述了,是一个请求上下文,请求对象,封装了客户端发出的HTTP请求的内容
session变量是一个用户会话,值为一个字典,该变量可以在多个请求之前持久保存和访问数据
from flask import Flask, session
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'
@app.route('/')
def index():
# 检查会话中是否存在用户名
if 'username' not in session:
# 如果不存在,则设置会话中的用户名为 "guest"
session['username'] = 'guest'
# 返回包含用户名的消息
return '<p>Hello, {}!</p>'.format(session['username'])
if __name__ == '__main__':
app.run()
需要注意的是,在会话开始之前你要设置一个秘钥,用于对会话进行加密和签名,是固定的,然后在函数中可以使用,python中有提供生成秘钥的方法
from flask import Flask
import secrets
# 导入secrets模块用于生成秘钥
app = Flask(__name__)
app.config['SECRET_KEY'] = secrets.token_hex(16)
print(app.config['SECRET_KEY'])#58b2ef16573d0774f965e9153df99ce5
2 flask请求对象属性
flask通过上下文变量request对外开放请求对象,这个对象包含了客户端HTTP 请求的全部信息
属性或方法 | 说明 |
---|---|
form | 一个字典。储存请求提交的所有表单字段 |
args | 一个字典,储存通过URL查询字符串传递的所有参数 |
values | 一个字典,form和args的结合 |
cookies | 一个字典,储存请求的所有cookies |
headers | 一个字典,储存请求的HTTP头部 |
files | 一个字典,请求储存上传的所有文件 |
get_data() | 返回请求主体缓冲的数据 |
get_json() | 返回一个Python字典,包含解析请求主体后得到的JSON |
blueprint | 处理请求的flask蓝本的名称,以后在说这个 |
endpoint | 处理请求的flask端点的名称:flask把视图函数的名称用作路由端点的名称 |
method | HTTP请求方法 |
scheme | URL方案,http或者https |
is_secure() | 连接是否安全,通过https发送请求的就是True |
host | 主机名+端口号 |
path | 路径,路由 |
query_string | URL的查询字符串部分,返回原始二进制值 |
full_path | URL的路径+查询字符串 |
url | 客户端请求的完整url |
base_url | 没有查询字符串的url |
remote_addr | 客户端IP地址 |
environ | 请求的原始WSGI环境字段 |
3 请求钩子
什么是请求钩子呢,很简单,比如一个功能大家每个视图函数都要使用,那我们不可能每次请求这个函数都加上这些代码,为了减少代码冗余,Flask提供了注册通用函数的功能,有点像模板继承,这些注册的函数可以在请求被分派到函数之前或者之后调用
flask支持的钩子函数,这里介绍两种,其余可以根据对应flask版本自行探索:
before_request:注册一个函数,在每次请求之前运行
after_request:注册一个函数,在每次请求之后进行
在请求钩子函数和视图函数之间共享数据,一般使用上下文全局变量g,for instance 在before_request处理程序可以从数据库中加载已经登录的用户保存到g.user里面,随后调用视图函数就可以用了
下面为钩子函数的用法示例:
@app.before_first_request
def first_request():
print 'first time request'
@app.after_request
def ind():
return 'Bye'
扫描二维码关注阿尘blog,一起交流学习
原文始发于微信公众号(阿尘blog):Python Web之路:Flask第五篇
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/188301.html