Flask中的http请求与响应
参考:《Flask web开发》
Flask 上下文全局变量
Flask使用上下文临时将某些对象变为全局可访问。在Flask中有两种上下文:应用上下文和请求上下文。
变量名 | 上下文 | 说明 |
---|---|---|
current_app | 应用上下文 | 当前应用的应用实例 |
g | 应用上下文 | 处理请求时用作临时存储的对象,每次请求都会重设这个对象 |
request | 请求上下文 | 请求对象,封装了客户端发出的HTTP请求中的内容 |
session | 请求上下文 | 用户会话,值为一个字典,存储请求之间需要“记住”的值 |
请求对象
Flask通过上下文变量request对外开放请求对象,这个对象包含了客户端发送的HTTP请求的全部信息。常用的属性和方法有:
属性或方法 | 说明 |
---|---|
form | 一个字典,存储请求提交的所有表单字段(post请求) |
args | 一个字典,存储通过URL查询字符串传递的所有参数(get请求) |
values | 一个字典,form和args的合集 |
cookies | 一个字典,存储请求的所有cookie |
headers | 一个字典,存储请求的所有HTTP头部 |
files | 一个字典,存储请求上传的所有文件 |
get_data() | 返回请求主体缓冲的数据 |
get_json() | 返回一个字典,包含解析请求主体后得到的JSON |
blueprint | 处理请求的Flask蓝本的名称 |
endpoint | 处理请求的端点的名称,Flask把视图函数的名称用作路由端点的名称 |
method | HTTP请求方法,如GET或POST |
scheme | URL方法(http或https) |
ts_secure | 通过安全的连接(https)发送请求时返回True(注:原书中此为方法,错误) |
host | 请求定义的主机名,可包含端口号 |
path | URL的路径部分 |
query_string | URL的查询字符串部分,返回原始二进制值 |
full_path | URL的路径和查询字符串部分 |
url | 客户端请求的完整URL |
base_url | 同url, 但没有查询字符串部分 |
remote_addr | 客户端的IP地址 |
environ | 请求的原始WSGI环境字典 |
代码演示
from flask import Flask, request
app = Flask(__name__)
@app.route('/index/', methods=['GET', 'POST'])
def index():
if request.method == 'POST': # post参数{'name': 'flask'}
print(request.form.get('name')) # flask
return 'post succeed'
elif request.method == 'GET': # 以url http://127.0.0.1:5000/index/?name=flask 为例
print(request.args.get('name')) # flask
print(request.values.get('name')) # flask
print(request.cookies) # {}
print(request.headers.get('User-Agent')) # Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0
print(request.get_data()) # b''
print(request.get_json()) # None
print(request.blueprint) # None
print(request.endpoint) # index
print(request.scheme) # http
print(request.is_secure) # False
print(request.host) # 127.0.0.1:5000
print(request.path) # /index/
print(request.query_string) # b'name=flask'
print(request.full_path) # /index/?name=flask
print(request.url) # http://127.0.0.1:5000/index/?name=flask
print(request.base_url) # http://127.0.0.1:5000/index/
print(request.remote_addr) # 127.0.0.1
print(request.environ)
return 'get succeed'
if __name__ == '__main__':
app.run(debug=True)
响应对象
常见的响应:
return "字符串"
return render_template # 返回模板
return redirect()
在视图函数中如果不想返回几个值组成的元组,可以使用make_response() 函数返回一个响应对象。
响应对象常见的属性和方法有:
属性或方法 | 说明 |
---|---|
status_code | HTTP数字状态码 |
headers | 一个类似字典的对象,包含随响应发送的所有头部 |
set_cookie() | 为响应添加一个cookie |
delete_cookie() | 删除一个cookie |
content_length | 响应主体的长度 |
content_type | 响应主体的媒体类型 |
set_data() | 使用字符串或字节值设定响应 |
get_data() | 获取响应主体 |
以及一个特殊类型,重定向。
from flask import Flask, request, make_response
app = Flask(__name__)
@app.route('/index/')
def index():
data = {
'msg': 'this document carries a cookie!'
}
response = make_response(data)
response.set_cookie('answer', '42')
response.headers['Content-Length'] = 100 # 默认为返回数据长度,可修改
response.headers['token'] = 'asd343asd' # 添加编辑header信息
print(request.cookies.get('answer')) # 第二次请求时会返回 42
return response
if __name__ == '__main__':
app.run(debug=True)