概述
1.request 请求
客户端发起的请求,我们可以通过flask的request对象接收,但是这个对象需要导入
1.1 常用属性
属性 | 说明 | 类型 |
---|---|---|
request.url | 请求的url | str |
request.method | 请求方式 | str |
request.headers | 请求头信息 | EnvironHeaders 类字典对象 |
request.args | 查询参数 | MultiDict |
request.form | 表单参数 | MultiDict |
request.data | 请求体数据 | bytes |
request.json | 请求体数据(json类型) | Dict |
request.files | 上传的文件 | MultiDict[str: FileStorage] |
request.cookies | 请求携带的cookie | MultiDict |
1.2 代码
比如说,获取客户端上传的图片
from flask import Flask, request
from werkzeug.datastructures import FileStorage
app = Flask(__name__)
@app.route("/")
def index():
# print(request.url)
# print(request.method)
# print(request.headers.get("Host"))
# print(request.args.get("mobile"))
# print(request.form.get("username"))
# print(request.data)
file = request.files.get("avatar") # type: FileStorage
file.save("1.png")
return "index"
if __name__ == '__main__':
app.run(debug=True)
注意,前端发送json数据才能使用request.json接收,例如用ajax发送json数据
$.ajax({
url: DOMAIN.domain + "website/video_parse",
method: "POST",
data: JSON.stringify({ // 要使用JSON.stringify转成json
url: url
}),
contentType: "application/json", //必须这样写
dataType: "JSON",
boforeSend: showModal(),
success: showResult,
error: function(e) {
toastr["error"]("解析错误", "错误")
},
complete: hideModal(),
})
2.Response 响应
2.1 响应对象
我们在flask的视图函数里直接return,客户端即可获得响应,实际上是flask帮我们封装成一个Response对象再返回给客户端。我们可以指定响应体、状态码和响应头,它会自动组包
from flask import Flask, request, Response
app = Flask(__name__)
@app.route("/")
def index():
# 返回值:响应体,状态码,响应头
return "index", 400, {"Server": "NB1.0"}
if __name__ == '__main__':
app.run(debug=True)
当然我们也可以使用make_response
自定义一个响应对象
from flask import Flask, make_response
app = Flask(__name__)
@app.route("/")
def index():
# 返回值:响应体,状态码,响应头
# return "index", 400, {"Server": "NB1.0"}
response = make_response("index", 400)
response.headers["Server"] = "NB1.0"
return response
if __name__ == '__main__':
app.run(debug=True)
2.2 响应json
json是一种非常常用的数据传输格式,如果需要响应json数据,我们可以使用json.dumps()
方法把字典变成字符串,然后再在响应头指定响应类型content-type:application/json
from flask import Flask, make_response
import json
app = Flask(__name__)
@app.route("/")
def index():
data_dic = {
"name": "pan",
"gender": 1,
"age": None
}
response = make_response(json.dumps(data_dic), 200)
response.headers["content-type"] = "application/json"
return response
if __name__ == '__main__':
app.run(debug=True)
当然,flask已经帮我们做好封装了,我们只需要调用jsonify()
方法即可
from flask import Flask, make_response, jsonify
app = Flask(__name__)
@app.route("/")
def index():
data_dic = {
"name": "pan",
"gender": 1,
"age": None
}
return jsonify(data_dic)
# 不构建字典也行,直接关键字传参
# return jsonify(name="pan", gender=1, age=None)
if __name__ == '__main__':
app.run(debug=True)
2.3 响应静态资源
在实例化Flask的时候可以传入static_folder(默认是static)和static_url_path(默认是None)两个参数指定静态资源的存储位置和访问路径
from flask import Flask
app = Flask(
__name__,
static_folder="static", # 静态资源存储目录
# static_url_path="/images" # 静态资源访问路径
)
if __name__ == '__main__':
print(app.url_map)
app.run(debug=True)
2.4 页面重定向、路由反转
这个很简单,只需要调用redirect(location, code=302, Response=None)
函数指定重定向页面即可
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route("/demo")
def demo():
url = url_for("demo2") # 路由反转,根据视图函数名获取路由地址
return redirect(url)
@app.route("/demo2")
def demo2():
return "this is demo2 page"
@app.route("/")
def index():
# 使用方法:redirect(location, code=302, Response=None)
# return redirect("https://www.baidu.com") # 临时重定向到百度,默认状态码是302
return redirect("/demo", 301) # 301永久重定向到自己的/demo路由
if __name__ == '__main__':
app.run(debug=True)
常用重定向状态码
状态码 | 说明 |
---|---|
300 | Multiple Choice,让用户选择 |
301 | Moved Permanently,永久重定向 |
302 | Found,临时重定向 |
303 | See Other,查看其它位置 |
304 | Not Modified,资源未发生变化 |
305 | Use Proxy,需要通过代理访问 |
关于http响应状态码,可以查看之前的文章
【Web】http响应状态码
3.状态保持
目前状态保持主要是session/cookie和jwt两种
3.1 cookie
cookie是保存在浏览器端的,存储长度有限,并且公开透明,所以一般不会存储敏感信息
from flask import Flask, make_response, Response, request
app = Flask(__name__)
@app.route("/login")
def login():
response = make_response("登录成功") # type: Response
# 设置cookie: key, value, 有效时间,若不设置,浏览器关闭则失效
response.set_cookie("name", "pan", max_age=3600)
response.set_cookie("user_id", "15", max_age=3600)
return response
@app.route("/logout")
def logout():
response = make_response("退出登录成功") # type: Response
# 删除cookie
response.delete_cookie("user_id")
response.delete_cookie("name")
return response
@app.route("/")
def index():
user_id = request.cookies.get("user_id")
name = request.cookies.get("name")
return f"user_id: {user_id}, name:{name}"
if __name__ == '__main__':
app.run(debug=True)
3.2 session
session比cookie安全,因为数据是加密存储的,使用session的步骤大概是
- 1.导包,from flask import Flask, session
- 2.设置秘钥,app.secret_key = “XXXXX”
- 3.设置有效时间,app.permanent_session_lifetime = timedelta(XXX)
- 4.把session当做字典操作
from datetime import timedelta
from flask import Flask, session
app = Flask(__name__)
app.secret_key = "sjofsarweasr" # 指定secret_ket, 用于加密
# 也可以使用下面的这种方式指定secret_key
# app.config["SECRET_KEY"] = "sjofsarweasr"
app.permanent_session_lifetime = timedelta(hours=2) # 设置有效期
@app.route("/login")
def login():
session["user_id"] = "15"
session["user_name"] = "pan" # 设置session值
session.permanent = True # 允许设置有效期
return "登录成功"
@app.route("/")
def index():
user_id = session.get("user_id")
user_name = session.get("user_name")
return f"user_id: {user_id}, user_name: {user_name}"
@app.route("/logout")
def logout():
# session.pop("user_id")
session.clear()
return "退出登录成功"
if __name__ == '__main__':
app.run()
3.3 JWT
我们可以把使用jwt做状态保持,jwt的好处之一是生成的token可以用于移动端、web端、pc端等多种场景使用
关于JWT的原理和使用可以参考之前的文章
【web】JWT(Json web token)的原理、签发、验证
我们可以使用pyjwt完成token的签发与验证工作
pip install pyjwt
from flask import Flask, request
import jwt
from datetime import datetime, timedelta
app = Flask(__name__)
SECRET_KEY = "afjopafjgvo234qd" # 秘钥
@app.route('/login')
def login():
expire = datetime.utcnow() + timedelta(hours=2) # 设置有效时长
payload = {
"user_id": 15,
"user_name": "pan",
"exp": expire
}
token = jwt.encode(payload=payload, key=SECRET_KEY, algorithm="HS256")
token = token.decode()
print("token: ", token)
return token
@app.route('/profile')
def profile():
token = request.headers["Authorization"]
try:
payload = jwt.decode(token, key=SECRET_KEY, algorithms=["HS256"])
except Exception as e:
print(e)
payload = None
if payload:
user_id = payload.get("user_id")
user_name = payload.get("user_name")
return "profile: {}, {}".format(user_id, user_name)
else:
# 401 权限认证失败
return "invalid token", 401
if __name__ == '__main__':
app.run(debug=True)
4.捕获异常
如果出现异常,比如说404资源不存在,那我们可以使用app.errorhandler()
进行捕获,参数是状态码或异常类
如果想主动抛出异常,我们可以使用abort()
from flask import Flask, redirect, abort
app = Flask(__name__)
@app.route("/")
def index():
# abort(404) # 主动抛出异常,为方便测试
a = 1 / 0
return "index"
@app.errorhandler(404) # 捕获异常状态码
def error_404(e):
print(e)
return redirect("http://err.www.mi.com/04.html")
@app.errorhandler(ZeroDivisionError) # 捕获异常类ZeroDivisionError
def err_handle():
print(e)
return "0不能当除数"
if __name__ == '__main__':
app.run()
最后
以上就是激动火为你收集整理的【Flask】请求、响应(重定向、路由反转)、状态保持、捕获异常的全部内容,希望文章能够帮你解决【Flask】请求、响应(重定向、路由反转)、状态保持、捕获异常所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复