我是靠谱客的博主 激动火,最近开发中收集的这篇文章主要介绍【Flask】请求、响应(重定向、路由反转)、状态保持、捕获异常,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.request 请求

客户端发起的请求,我们可以通过flask的request对象接收,但是这个对象需要导入

1.1 常用属性
属性说明类型
request.url请求的urlstr
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请求携带的cookieMultiDict
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)

常用重定向状态码

状态码说明
300Multiple Choice,让用户选择
301Moved Permanently,永久重定向
302Found,临时重定向
303See Other,查看其它位置
304Not Modified,资源未发生变化
305Use 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】请求、响应(重定向、路由反转)、状态保持、捕获异常所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部