flask的生命周期
客户端--->wsgi应用程序->全局钩子--> 路由 --> 视图 --> 路由---> 全局钩子 ---> wsgi应用程序---> 客户端

请求
文档: https://flask.palletsprojects.com/en/2.0.x/api/#flask.Request
-
request:flask中代表当前请求的
request 对象 -
作用:在视图函数中取出本次客户端的请求数据
-
导入:
from flask import request -
代码位置:
-
代理类(引用) from flask.app import Request ---> from flask.globals.RequestFLask之Local、LocalStack和LocalProxy介绍-优快云博客
-
源码类(实际位置):from flask.wrappers.Request
-
基类:from werkzeug.wrappers import Request as RequestBase
-
request,常用的属性如下:
| 属性 | 说明 | 类型 |
|---|---|---|
| data | 记录请求体的数据,并转换为字符串 只要是通过其他属性无法识别转换的请求体数据 最终都是保留到data属性中 例如:有些公司开发微信小程序,原生IOS或者安卓,这一类客户端有时候发送过来的数据就不一样是普通的表单,查询字符串或ajax | bytes类型 |
| form | 记录请求中的html表单数据 | ImmutableMultiDict |
| args | 记录请求中的查询字符串,也可以是query_string | ImmutableMultiDict |
| cookies | 记录请求中的cookie信息 | Dict |
| headers | 记录请求中的请求头 | ImmutableMultiDict |
| method | 记录请求使用的HTTP方法 | GET/POST |
| url | 记录请求的URL地址 | string |
| files | 记录请求上传的文件列表 | ImmutableMultiDict |
| json | 记录ajax请求的json数据 | Dict |
获取查询字符串 :
from flask import Flask, request
from urllib.parse import parse_qs
app = Flask(__name__)
@app.route("/qs")
def qs():
"""
获取客户端请求的查询字符串参数
:return:
"""
"""
请求url:http://127.0.0.1:5000/qs?user=xiaoming&age=16
"""
# 获取原始的查询字符串参数,格式:bytes
# print(request.query_string)
# b'user=xiaoming&age=16'
# # 针对原始的查询字符串参数,转换成字典格式
# query_string = parse_qs(request.query_string.decode())
# print(query_string) # {'user': ['xiaoming'], 'age': ['16']}
# # 获取参数值
# print(query_string["user"][0])
# # 获取查询字符串参数,格式:ImmutableMultiDict
# print(request.args)
# # ImmutableMultiDict([('user', 'xiaoming'), ('age', '16')])
# # 获取单个参数值
# print(request.args["user"])
# print(request.args["age"])
# print(request.args.get("age"))
"""
请求url:http://127.0.0.1:5000/qs?user=xiaoming&fav=shopping&fav=coding&fav=rap
"""
# print(request.args["user"]) # 'xiaoming'
# print(request.args["fav"]) # 'shopping'
# print(request.args.get("user")) # 'xiaoming'
print(request.args.getlist("fav")) # ['shopping', 'coding', 'rap']
return "hello, flask"
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
获取请求中各项数据
import json
from flask import Flask, request
app = Flask(__name__)
@app.route("/form1", methods=["post"])
def form1():
"""
获取客户端请求的请求体[表单]
:return:
"""
"""
获取表单数据
请求url:
"""
"""获取表单数据[不包含上传文件]"""
# print(request.form)
# # ImmutableMultiDict([('username', 'root'), ('password', '123456'), ('fav', 'swimming'), ('fav', 'watch TV')])
# # 获取表单项数据[单个值]
# print(request.form.get("username")) # root
# # 获取表单项数据[多个值]
# print(request.form.getlist("fav")) # ['swimming', 'watch TV']
"""获取表单数据的上传文件"""
# print(request.form.get("username"))
# # 获取所有上传文件
# print(request.files) # ImmutableMultiDict([('avatar', <FileStorage: 's.png' ('image/png')>)])
# # 根据name值获取单个上传文件
# print(request.files.get("avatar")) # <FileStorage: 's.png' ('image/png')>
# # 根据name值获取多个上传文件
# print(request.files.getlist("avatar")) # [<FileStorage: 'a.png' ('image/png')>, <FileStorage: 's.png' ('image/png')>]
return "hello, flask"
@app.route("/data", methods=["post"])
def data():
"""
获取客户端请求的请求体[ajax]
:return:
"""
"""判断本次客户端是否是ajax请求获取本次客户端提交的数据格式是否是json"""
# print(request.is_json)
"""获取客户端请求体中的json数据"""
# print(request.json) # {'username': 'root', 'password': '123456'}
"""获取客户端请求体的原始数据"""
# print(request.data) # b'{\n "username": "root",\n "password": "123456"\n}'
# 原始数据转json格式
# print(json.loads(request.data)) # {'username': 'root', 'password': '123456'}
"""接收其他格式类型的数据"""
# print(request.data)
return "hello, flask"
@app.route("/file", methods=["post", "put", "patch"])
def file():
"""
接收上传文件并保存文件
:return:
"""
avatar = request.files.get("avatar")
print(avatar)
# 调用FileStorage提供的save方法就可以保存文件了
avatar.save("./avatar.png")
return "hello, flask"
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
获取请求头等相关数据
import json
from flask import Flask, request
app = Flask(__name__)
@app.route("/header", methods=["get", "post", "put", "patch","delete"])
def header():
"""
获取请求头等其他请求信息
:return:
"""
# # 获取请求头所有信息
# print(request.headers, type(request.headers))
#
# """
# 获取单个请求头信息
# """
# # 基于get使用请求头原始属性名获取, User-Agent 客户端的网络代理工具名称
# print(request.headers.get("User-Agent")) # PostmanRuntime/7.26.10
# # 把原始属性名转换成小写下划线格式来获取
# print(request.user_agent) # PostmanRuntime/7.26.10
#
# # 获取本次客户端请求的服务端地址
# print(request.host) # 127.0.0.1:5000
#
# # 获取本次客户端请求提交的数据格式
# print(request.content_type) # multipart/form-data;
#
# # 获取本次客户端请求的uri路径
# print(request.path) # /header
# # 获取本次客户端请求完整url地址
# print(request.url) # http://127.0.0.1:5000/header
# # 获取本次客户端请求的服务端域名
# print(request.root_url) # http://127.0.0.1:5000/
#
# # 获取本次客户端的Http请求方法或请求动作
# print(request.method) # POST
#
# # 获取本次客户端的IP地址
# print(request.remote_addr) # 127.0.0.1
#
# # 获取本次客户端获取到的服务端信息
# print(request.server) # ('0.0.0.0', 5000)
# 获取本次客户端请求时,服务端的系统系统环境变量信息
# print(request.environ)
"""
获取自定义请求头
"""
print(request.headers.get("company")) # flask.edu
return "hello, flask"
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
响应
flask默认支持2种响应方式:
数据响应: 默认响应html文本,也可以返回 JSON格式,或其他媒体类型的文件
页面响应: 重定向
url_for 视图之间的跳转
响应的时候,flask也支持自定义http响应状态码
响应html文本
from flask import Flask, make_response, Response
app = Flask(__name__)
@app.route("/")
def index():
"""响应HTML文本,并设置响应状态码"""
# return "<h1>hello, flask</h1>", 400
"""通过make_response返回Response对象"""
# response = make_response("<h1>hello, flask</h1>", 201)
# print(response)
# return response
"""通过Response返回Response对象"""
response = Response("<h1>hello, flask</h1>", 201)
return response
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
返回JSON数据
import json
from flask import Flask, make_response, Response, jsonify
app = Flask(__name__)
@app.route("/jsonapi")
def jsonapi():
"""响应json数据[原生写法]"""
data = {"name": "xiaoming", "age": 16}
# return json.dumps(data), 200, {"Content-Type": "application/json"}
# return Response(json.dumps(data), 200, {"Content-Type": "application/json"})
"""响应json数据[jsonify]"""
data = {"name": "xiaoming", "age": 16}
response = jsonify(data)
print(response)
return response
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
响应指定媒体类型的文件
import json
from flask import Flask, make_response, Response, jsonify
app = Flask(__name__)
@app.route("/img")
def img():
"""响应图片格式给客户端"""
with open("avatar.png", "rb") as f:
data = f.read()
return data, 200, {"Content-Type": "image/png"} # MIME类型
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
常见 MIME 类型示例
以下是一些常见的 MIME 类型及其对应的文件扩展名:
1. 文本类型:
- text/plain:普通文本文件(如 .txt)
- text/html:HTML 文件(如 .html, .htm)
- text/css:CSS 样式表(如 .css)
2. 图像类型:
- image/jpeg:JPEG 图像(如 .jpg, .jpeg)
- image/png:PNG 图像(如 .png)
- image/gif:GIF 图像(如 .gif)
3. 音频类型:
- audio/mpeg:MP3 音频(如 .mp3)
- audio/wav:WAV 音频(如 .wav)
4. 视频类型:
- video/mp4:MP4 视频(如 .mp4)
- video/mpeg:MPEG 视频(如 .mpeg, .mpg)
5. 应用程序类型:
- application/pdf:PDF 文档(如 .pdf)
- application/zip:ZIP 压缩文件(如 .zip)
- application/vnd.ms-excel:Excel 文件(如 .xls, .xlsx)
重定向
重定向到站点地址
from flask import Flask, request, redirect, url_for, Response
app = Flask(__name__)
@app.route("/jump")
def jump():
"""跳转页面到站外"""
"""
301: 永久重定向,页面已经没有了,站点没有了,永久转移了。[域名映射-->域名解析]
302:临时重定向,一般验证失败、访问需要权限的页面进行登录跳转时,都是属于临时跳转。
"""
# response = redirect("https://www.qq.com", 302)
# print(response)
# return response
# 底层原理
response = Response("", 302, {"Location": "https://www.163.com"})
return response
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
重定向到自己写的视图函数
from flask import Flask, request, redirect, url_for, Response
app = Flask(__name__)
@app.route("/user")
def index():
if request.args.get("token"):
return "个人中心"
# 跳转页面到登录视图中
# redirect("url地址") # 控制页面跳转到任意路径下
# return redirect("/login")
# 跳转页面到其他视图中
url = url_for("login") # url_for("视图名称")
print(app.url_map) # 路由列表,整个flask站点中所有的url地址和视图的映射关系都在这个属性里面
print(url)
return redirect(url)
@app.route("/login")
def login():
return "登录视图"
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
在 url_for 函数中传入参数
from flask import Flask, request, redirect, url_for, Response
app = Flask(__name__)
@app.route("/mobile/<int:mobile>")
def sms(mobile):
"""发送短信"""
return f"发送短信给{mobile}"
@app.route("/info")
def info():
# 跳转页面到一个具有路由参数的视图中
# return redirect("/sms/13012345678")
url = url_for("sms", mobile="13012345677")
print(url) # /sms/13012345677
return redirect(url)
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
自定义状态码和响应头
在 Flask 中,可以很方便的返回自定义状态码,以实现不符合 http 协议的状态码,例如:status code: 666
from flask import Flask, request, redirect, url_for, Response
app = Flask(__name__)
@app.route("/")
def index():
"""自定义响应头"""
return "hello, flask", 201, {"Company": "flask.edu"}
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
601

被折叠的 条评论
为什么被折叠?



