Flask之请求和响应

Flask中的request请求

  • request:flask中代表当前请求的 request 对象
  • 作用:在视图函数中取出本次请求数据
  • 导入from flask import request
  • 代码位置
    • 代理类 from flask.app import Request,
    • 源码类:from werkzeug.wrappers.Request
    • 父类:from werkzeug.wrappers.base_request

常用的属性如下:

属性 说明 类型
data 记录请求体的数据,并转换为字符串
只要是通过其他属性无法识别转换的请求体数据
最终都是保留到data属性中
例如:有些公司开发小程序,原生IOS或者安卓,这一类客户端有时候发送过来的数据就不一样是普通的表单,查询字符串或ajax
bytes类型
form 记录请求中的html表单数据 MultiDict
args 记录请求中的查询字符串,也可以是query_string MultiDict
cookies 记录请求中的cookie信息 Dict
headers 记录请求中的请求头 EnvironHeaders
method 记录请求使用的HTTP方法 GET/POST
url 记录请求的URL地址 string
files 记录请求上传的文件列表 *
json 记录ajax请求的json数据 json

获取args参数

获取get参数的数据,也就是url问号后的键值对数据

from flask import Flask, request
app = Flask(__name__)
@app.route('/args')
def args():
"""1.获取查询字符串 """
# request
print(request)
"""
访问路径:
http://127.0.0.1:5000/args?name=pure3417&pwd=123&like=sing&like=running
打印结果:
<Request 'http://127.0.0.1:5000/args?name=pure3417&pwd=123&like=sing&like=running' [GET]>
"""
# 获取原生查询字符串 query_string
print(request.query_string)
"""
访问路径:
http://127.0.0.1:5000/args?name=pure3417&pwd=123&like=sing&like=running
打印结果:
b'name=pure3417&pwd=123&like=sing&like=running'
"""
# 获取查询字符串
print(request.args) # 获取查询字符串 也就是url问号后面的
"""
访问路径:
http://127.0.0.1:5000/args?name=pure3417&pwd=123&like=sing&like=running
打印效果:
ImmutableMultiDict([('name', 'zero'), ('pwd', '123')])
MultiDict内部实现的是OrderDict字典结构
from collections import OrderedDict # 有序字典
"""
# 获取指定参数的值,有两种方式
print(request.args.get('name'))
print(request.args['name']) # 不推荐,获取没有指定的参数会报错
"""
访问路径:
http://127.0.0.1:5000/args?name=pure3417&pwd=123&like=sing&like=running
打印结果:
pure3417
"""
# 获取指定参数的多个值,用于接收表单的多选框值 列表类型
print(request.args.getlist('like'))
"""
访问路径:
http://127.0.0.1:5000/args?name=pure3417&pwd=123&like=sing&like=running
打印结果:
['sing', 'running']
"""
return 'hello flask'
if __name__ == '__main__':
app.run(debug=True)

获取data请求体数据

接受客户端发送过来的原生请求体数据,是request.json,request.form,request.files等无法接收的数据,全部会保留到这里

from flask import Flask, request
import json
app = Flask(__name__)
@app.route("/post", methods=["post", "put", "patch"])
def post():
"""2.获取请求体请求数据"""
"""
请求路径:http://127.0.0.1:5000/post
参数:JSON
{
'username': 'pure3417',
'pwd': '123456'
}
"""
print(request.data) # 打印结果:b'{\n\t"name": "pure3417",\n\t"pwd": "123456"\n}'
data = json.loads(request.data)
print(data) # 结果: {'name': 'pure3417', 'pwd': '123456'} 在flask版本较低中使用
return "post ok"
if __name__ == '__main__':
app.run(debug=True)

获取form表单数据

from flask import Flask, request
import json
app = Flask(__name__)
@app.route("/form", methods=['post'])
def form():
# 接受表单提交的数据
print(request.form) # ImmutableMultiDict([('password', '123456'), ('username', 'pure3417')])
print(request.form.get("username")) # pure3417
return "ok"
if __name__ == '__main__':
app.run(debug=True)

获取files文件

from flask import Flask, request
app = Flask(__name__)
@app.route("/files", methods=['post'])
def files():
# 接收上传,files是一个列表
print(request.files) # ImmutableMultiDict([('avatar', <FileStorage: 'hlw.jpg' ('image/jpeg')>)])
avatar = request.files.get("avatar") # ImmutableMultiDict([('avatar', <FileStorage: 'hlw.jpg' ('image/jpeg')>)])
print(avatar) # <FileStorage: 'hlw.jpg' ('image/jpeg')>
return "ok"
if __name__ == '__main__':
app.run(debug=True)

获取headers请求头

from flask import Flask, request
app = Flask(__name__)
@app.route('/headers', methods=['get', 'post'])
def headers():
# 获取请求头的数据
print(request.headers)
"""
访问链接:
http://127.0.0.1:5000/headers
打印内容:
Host: 127.0.0.1:5000
Connection: keep-alive
Content-Length: 0
Sec-Ch-Ua: " Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"
Cache-Control: no-cache
Sec-Ch-Ua-Mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36
Postman-Token: 849df90b-812c-9d9e-5bb0-7dc6d8956038
Accept: */*
Origin: chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop
Sec-Fetch-Site: none
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
"""
print(request.headers.get('Host')) # 打印内容:127.0.0.1:5000
# 例2:获取自定义的请求头信息
print(request.headers.get('pure'))
"""
参数:在Headers上加键值对: pure 3417
打印内容:3417
"""
return 'header ok'
if __name__ == '__main__':
app.run(debug=True)

获取url地址

from flask import Flask, request
app = Flask(__name__)
@app.route('/urls', methods=['post'])
def url():
# 获取本次请求的URL
print(request.url) # http://127.0.0.1:5000/urls
return 'ok'
if __name__ == '__main__':
app.run(debug=True)

获取method方法

from flask import Flask, request
app = Flask(__name__)
# methods=['get', 'post', 'put', 'delete'] 表示允许访问的方法
@app.route('/method', methods=['get', 'post', 'put', 'delete'])
def method():
# 打印请求方法
print(request.method)
"""
get 的时候打印:
GET
post的时候:
POST
put的时候:
PUT
delete的时候:
DELETE
"""
return 'method ok'
if __name__ == '__main__':
app.run(debug=True)

获取json数据

from flask import Flask, request
app = Flask(__name__)
# methods=['get', 'post', 'put', 'delete'] 表示允许访问的方法
@app.route('/json', methods=['get', 'post', 'put', 'delete'])
def json():
# 接受ajax或其他客户端提交过来的json数据
print(request.json) # {'username': 'pure34q7', 'password': '123'}
return 'json ok'
if __name__ == '__main__':
app.run(debug=True)

Flask中的响应

flask默认支持2种响应方式:

  • 数据响应: 默认响应html文本,也可以返回 JSON格式,或其他格式

  • 页面响应: 重定向

响应的时候,flask也支持自定义http响应状态码

返回页面响应

from flask import Flask, make_response
app = Flask(__name__)
@app.route('/')
def index():
# [默认支持]响应html文本
return "<h1>hello user</h1>"
# return make_response("<h1>hello user</h1>") # 等同于上面的一段
if __name__ == '__main__':
app.run(debug=True)

返回JSON数据

from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/')
def index():
# #也可以响应JSON格式代码
# data = {
# "id":1,
# "uname":"pure3417"
# }
# 支持列表形式的JSON数据
data = [
{"id": 1, "username": "pure3417", "age": 18},
{"id": 2, "username": "pure3417", "age": 17},
{"id": 3, "username": "pure3417", "age": 16},
{"id": 4, "username": "pure3417", "age": 15},
]
# flask中返回json数据,都是flask的jsonify方法返回就可以了.
return jsonify(data)
if __name__ == '__main__':
app.run(debug=True)

响应其他数据格式

from flask import Flask, jsonify, make_response
app = Flask(__name__)
@app.route('/')
def index():
# # 返回图片等其他自定义格式数据
# with open('关注.webp', "rb") as f:
# content = f.read()
# response = make_response(content)
# response.headers["Content-Type"] = "image/jpg" # MIME type 类型
# return response
# 下载文件
with open("关注.webp","rb") as f:
content = f.read()
response = make_response(content)
response.headers["Content-Type"] = "application/zip"
return response
if __name__ == '__main__':
app.run(debug=True)

具体的 MIME type 类型可以查看 MIME 参考手册

重定向

from flask import Flask, redirect
app = Flask(__name__)
@app.route("/")
def user():
# 页面跳转 redirect函数就是response对象的页面跳转的封装
return redirect("http://www.baidu.com")
# # redirect内部完成的事情如下:
# from werkzeug.wrappers import Response
# response = Response()
# response.headers["Location"] = "http://www.baidu.com"
# return response
if __name__ == '__main__':
app.run(debug=True)

重定向到自己写的视图函数

可以直接填写自己 url 路径

也可以使用 url_for 生成指定视图函数所对应的 url,通过redirect来完成跳转

from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route("/")
def index():
"""响应处理"""
# 根据视图名称进行页面跳转
# url_for 根据视图函数名获取对应的uri地址
url = url_for("user")
print(url) # 仅仅是根据参数从app.url_map中提取对应的url地址
return redirect(url)
@app.route("/user")
def user():
return "用户中心"
if __name__ == '__main__':
app.run(debug=True)

重定向到带有参数的路由视图

from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route("/")
def index():
"""响应处理"""
# 根据视图名称进行页面跳转
url = url_for("user", user_id=3)
return redirect(url)
@app.route("/user/<user_id>")
def user(user_id):
return f"用户中心,user_id={user_id}"
if __name__ == '__main__':
app.run(debug=True)

自定义响应头和状态码

在 Flask 中,可以很方便的返回自定义状态码,以实现不符合 http 协议的状态码,例如:pure: 3417

from flask import Flask, make_response
app = Flask(__name__)
@app.route('/')
def index():
return '状态码为 666', 400
# 还可以使用make_response创建Response对象,然后通过response对象返回数据
@app.route("/pure")
def index2():
response = make_response("ok")
print(response) # <Response 2 bytes [200 OK]>
response.headers["Company"] = "pure" # 自定义响应头
response.status_code = 201 # 自定义响应状态码
return response
if __name__ == '__main__':
app.run(debug=True)
posted @   pure3417  阅读(483)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示