Flask请求和响应
Flask请求和响应
flask请求对象
使用Flask Request对象需要在Flask应用程序中导入request模块。
requset:全局的,但是也是每个请求一个request
from flask import Flask, render_template, request
from flask.views import View, MethodView
app = Flask(__name__, template_folder='templates')
@app.route('/', methods=['GET', 'POST'])
def index():
# 在哪个视图函数执行 , request对象就是属于哪个视图函数
print(request.path) # /
return 'index'
@app.route('/home', methods=['GET', 'POST'])
def home():
print(request.path) # /home
return 'home'
if __name__ == '__main__':
app.run()
request参数
Flask Request对象是一个封装了HTTP请求信息的类,它提供了访问HTTP请求的各种属性和方法
如URL参数、表单数据、文件上传等。
request.method 提交的方法
request.args get请求提及的数据
request.form post请求提交的数据
request.values post和get提交的数据总和
request.cookies 客户端所带的cookie
request.headers 请求头
request.path 不带域名,路由中请求路径
request.full_path 不带域名,带参数的请求路径
request.script_root
request.url 带域名带参数的完整的请求路径
request.base_url 带域名请求路径
request.url_root 域名
request.host_url 只有主机和端口号的url
request.host 127.0.0.1:500
request.remote_addr 客户端ip
request.data 包含传入的请求数据作为字符串
request.json 获取json数据
request.files 获取请求上传的文件
obj = request.files['the_file_name']
obj.save('/var/www/uploads/' + secure_filename(f.filename))
from flask import Flask, request
wen = Flask(__name__)
@wen.route("/request/info", methods=["GET"])
def get_request_info():
print(f"request.args类型:{type(request.args)}")
print(f"request.args = {request.args}\n")
print(f"request.json类型:{type(request.json)}")
print(f"request.json = {request.json}\n")
print(f"request.files类型:{type(request.files)}")
print(f"request.files = {request.files}\n")
print(f"request.form类型:{type(request.form)}")
print(f"request.form = {request.form}\n")
print(f"request.method类型:{type(request.method)}")
print(f"request.method = {request.method}\n")
print(f"request.url类型:{type(request.url)}")
print(f"request.url = {request.url}\n")
print(f"request.host类型:{type(request.host)}")
print(f"request.host = {request.host}\n")
print(f"request.headers类型:{type(request.headers)}")
print(f"request.headers = {request.headers}\n")
return {"status": 0, "message": "get success"}
if __name__ == "__main__":
wen.run()
args-Get参数获取
args属性是请求路径中的查询参数,例如:/hello?name=zs
, args 解析出来的数据是一个类似字典的对象,例如 args = {"name": 'zx'}
print(request.args)
request.args.get('参数名') # 获取 GET 请求参数
request.args['name']
request.args['age']
request.args.get('name')
request.args.getlist('name')
form-POST请求参数
form 顾名思义是表单数据,当请求头content-type 是 application/x-www-form-urlencoded 或者是 multipart/form-data 时,请求体的数据才会被解析为form属性。
print(reqeust.form)
request.form.get('参数名') # 获取 POST 请求参数
request.values.get('参数名')
from flask import request
@app.route('/user')
def user():
uid = request.args.get('uid')
return 'USER ID: {}'.format(uid)
JSON
如果我将content-type指定为application/json, flask就会将接收到的请求体数据做一次json编码转换,将字符串转换为字典对象,赋值给属性json
@app.route("/hello", methods=["GET", "POST"])
def hello():
print("content_type:", request.headers.get("content_type"))
print("data:", request.data)
print("form:", request.form)
print("json:", request.json)
return ""
request.values
values 是 args 和 form 两个字段的组合
可以同时获取args参数和form表单参数
@app.route("/hello", methods=["GET", "POST"])
def hello():
print("content_type:", request.headers.get("content_type"))
print("args:", request.args)
print("form:", request.form)
print("values:", request.values)
return "hello"
路径属性
request.path 路由中的路径
request.url 完整的请求地址
request.base_url 去掉GET参数的url
request.host_url 只有主机和端口号的url
request.remote_addr 客户端ip
路由转化器
有时我们需要将同一类URL映射到同一个视图函数处理
比如:使用同一个视图函数 来显示不同用户的个人信息。
# 请求访问接口地址为:/users/1,其中1是具体请求参数
# 请求访问接口地址为:/users/2,其中2是具体请求参数
# 请求访问接口地址为:/users/3,其中3是具体请求参数
@app.route('/user/<uid>')
def user(uid):
print(type(uid))
return 'USER ID: {}'.format(uid)
@app.route('/user/<int:uid>')
def user(uid):
print(type(uid))
return 'USER ID: {}'.format(uid)
@app.route('/user/<int(min=5):uid>')
def user(uid):
print(type(uid))
return 'USER ID: {}'.format(uid)
自定义转换器
from flask import Flask
from werkzeug.routing import BaseConverter
app = Flask(__name__)
# 自定义一个转换器类
class RegexMobileConverter(BaseConverter):
regex = r'1[3-9]\d{9}'
def __init__(self, url_map):
#调用父类方法
super(RegexMobileConverter, self).__init__(url_map)
# 将转换器注册到app中去
app.url_map.converters['mobile'] = RegexMobileConverter
#打印输出所有的系统转换器列表
print(app.url_map.converters)
# 路由使用转换器
@app.route('/user/<mobile:temp>')
def create_new(temp):
print(temp)
return f'mobile{temp}'
if __name__ == '__main__':
print(app.url_map)
app.run()
flask响应返回
Flask中的Response对象是用于构建 HTTP 响应的类。它继承自 Python 标准库中的werkzeug.wrappers.Response
类,提供了一些方便的方法,如设置响应头、状态码和内容等。
可以设置的响应返回有:
- 1 直接返回字符串
- 2 返回模板渲染:render_template
- 3 返回重定向: redirect
- 4 返回json格式:jsonify
- 5 自定义响应对象
from flask import Flask, request
app = Flask(__name__)
@app.route('/post',methods = ['POST', 'GET'])
def post():
if request.method == 'POST':
# request.form:表单数据
result = request.form
print(result)
return "post"
# 返回模板
@app.route('/')
def student():
return render_template('index.html')
# 返回字符串
@app.route('/get')
def get():
# 获取URL参数中名为name的值,默认为Jack
name = request.args.get('name', 'Jack')
return f'Hello, {name}!'
@app.route('/upload', methods=['POST'])
def upload():
# 获取上传文件对象
file = request.files['file']
if file:
return 'File uploaded successfully.'
if __name__ == '__main__':
app.run()
返回json
在使用json都是自己使用json.dumps方法把数据转成json。并把响应头媒体类型定义成application/json
其实flask帮我们封装了一个方法,专门用于返回json数据响应对象。
from flask import jsonify
@app.route('/')
def index():
json_dict = {
"name": 'Flask',
"age": 22
}
return jsonify(json_dict)
也是用Response类处理
并自动获取config里面的源类型 默认是application/json
自定义响应对象
在return的时时候,可以接收三个参数,第一个响应数据,第二个响应状态码,第三个响应头
可以手动修改 响应状态和响应头
@app.route("/", methods=["GET", "POST"])
def index():
return json.dumps({"username": "jiangmingbai"}), 201, {"content-type": "application/json"`}
调用 make_response()
函数来创建一个响应对象并将字符串Hello, World
设置为响应体。然后,设置响应头部信息 Token
,设置响应状态码200 OK
,并最终将响应对象返回给客户端。
from flask import make_response
@app.route('/')
def index():
resp = make_response('Hello World') #res 就是响应对象, Hello World是响应体
resp.headers["Token"] = "Python"
resp.status = "200 OK"
return resp
make_response()里基于current_app.make_response(args)方法
def __init__(
self,
response=None, # 响应数据
status=None, # 状态码
headers=None, # 头信息
mimetype=None, # 媒体类型
content_type=None,
direct_passthrough=False,
):
from flask import Flask, make_response
app = Flask(__name__)
@app.route("/", methods=["GET", "POST"])
def index():
r = make_response(json.dumps({"username": "beike"}), 201, {"content-type": "application/json"})
print(r) # <Response 28 bytes [201 CREATED]>实例对象
r.status = "202 OK" # 通过实例在赋值stutas时必须是字符串
return r
if __name__ == '__main__':
app.run(debug=True)
重定向
在 Flask 中,可以使用 redirect 函数进行重定向。该函数位于 flask 模块中,可以接受一个 URL 参数作为重定向的目标。调用时,它返回一个响应对象,并将用户重定向到具有指定状态代码的另一个目标位置
- 网页上的网址(完整的)
- 自己写的视图函数,使用url_for('蓝图名称.视图函数') 反向解析
# 当用户访问根URL/ 时,会调用index函数,并在其中调用 redirect 函数,将用户重定向到login视图函数所对应的 URL。
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route('/')
def index():
return redirect(url_for('login'))
@app.route('/login')
def login():
return 'Login page'
# 当访问URL/test 时,会重定向到baidu.com
@app.route('/test')
def test():
return redirect('http://www.baidu.com')
URL 参数可以是相对路径或绝对路径。如果传入的是相对路径,则会基于当前请求的 URL 进行解析,生成最终的重定向目标 URL。
Cookies对象
Cookie技术是用来保持web访问状态
Cookie技术通过在请求和响应报文中添加Cookie数据来保存客户端的状态信息
设置cookie,默认有效期是临时cookie,浏览器关闭就失效
在设置 cookie 时,可以指定其过期时间、域名、路径等信息。在 Flask 中,可以通过设置 max_age、expires、domain、path 等参数来实现这些功能。
from flask import make_response
@app.route('/set')
def set():
resp = make_response('Hello World')
resp.set_cookie('Token', 'Python' , max_age=3600)
return resp
# resp.set_cookie('user', 'Tom', max_age=3600, expires=None, domain=None, path='/')
获取和删除
@app.route('/get')
def get():
resp = request.cookies.get('Token')
return resp
@app.route('/delete')
def delete():
response = make_response('Successfully')
response.set_cookie('username', '', expires=0) # 设置Cookie过期时间为0
return response
Cookie的特点
① 数据全都是存储在客户端中,存储使用的是键值对结构进行存储
② Cookie支持过期时间
③ Cookie不能跨域名,不能跨浏览器
④ 根据域名进行Cookie存储
⑤ Cookie是通过服务器创建的Response来创建的
Session会话对象
浏览器中手动添加和修改Cookie是很容易的事情,如果直接把认证信息以明文的方式存储在Cookie里,那么恶意用户就可以通过伪造Cookie的内容来获取对网站的权限。为了避免上述的问题,我们需要对铭感的Cookie内容进行加密,出现了Session
Session指用户会话(user session),即服务器和客户端/浏览器之间或桌面程序和用户之间建立的交互活动
在Flask中,Session对象用来加密Cookie,默认情况下,它会把数据存储在浏览器上一个名为"session"的Cookie里,Session通过密钥对数据进行签名以加密数据,因此我们需要先设置一个密钥,这里的密钥就是一个具有一定复杂度和随机性的字符串
from flask import Flask, session
app = Flask(__name__)
app.secret_key = 'your-secret-key' # 设置密钥,用于加密Session数据
@app.route('/')
def hello():
# 设置Session数据
session['username'] = 'John'
return 'Hello, World!'
@app.route('/user')
def get_user():
# 获取Session数据
username = session.get('username')
if username:
return f'Current user: {username}'
else:
return 'User not found'
if __name__ == '__main__':
app.run()
获取删除和设置
session.get(key, default=None)
session['key'] = 'value'
# 删除某一值
session.pop(key)
# 清除所有(慎用,会删除服务器下的所有session)
session.clear()
Session的特点
① 所有数据存储在服务器中,默认存储在内存中
② 存储结构是键值对(key-value)格式
③ Session依赖于Cookie
参考资料
https://blog.csdn.net/qq_38628046/article/details/129090168
https://www.cnblogs.com/dream-ze/p/17659504.html 请求和响应