Python Web之路:Flask第五篇

点击名片关注 阿尘blog,一起学习,一起成长

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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!