Flask(四) 响应

125 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

10.响应

10.1 跳转模板

上面我们的返回值都是数据直接展示,也可以跳转到模板中

使用 render_template 跳转模板

from flask import Flask, render_template

app = Flask(__name__)


@app.route("/")
def index():
    return render_template("index.html")

在templates(默认模板目录,可以通过参数配置)目录下新建index.html

<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>

<h1>My First Heading</h1>
<p>My first paragraph.</p>

</body>
</html>

10.2 重定向

将请求重定向到其他接口

使用 redirect 重定向

from flask import Flask, redirect

app = Flask(__name__)


@app.route("/redirect")
def redirect_baidu():
    return redirect("https://www.baidu.com")

在访问http://127.0.0.1:5000/redirect时会重定向到 www.baidu.com/

10.3 返回json数据

在正常的前后端联调时,json格式的数据是共同的标准.

flask提供jsonify来对响应数据进行包装,返回给前端json数据

from flask import Flask, jsonify

app = Flask(__name__)


@app.route("/json")
def get_json():
    json_dict = {
        'name': 'zhangsan',
        'age': 18
    }
    return jsonify(json_dict)

jsonify与上文我们测试的json.dumps()的区别:

json.dumps只是将python对象转换json对象字符串,响应头中并没有设置application/json,浏览器并无法把响应数据解析为json格式,前端需要手动处理,将字符串再次转换为json格式

而jsonify除了将对象转换为json格式外, 还在响应头中设置application/json, 这样前端可以直接使用.

10.4 响应头

flask也可以对响应头进行设置

有两种方式设置:

10.4.1 直接返回

视图中return 可以返回多个参数, 第一个参数为返回的数据, 第二个参数为响应码, 第三个参数为headers

from flask import Flask

app = Flask(__name__)


@app.route("/response")
def get_response():
    return "状态码", 700, {"test": "test"}

headers可以使用字典,也可以使用列表+元组的方式

效果:

10.4.2 构造make_response

flask也提供了mask_response来构造response

from flask import Flask, make_response

app = Flask(__name__)


@app.route("/response")
def get_response():
    resp = make_response("make_response")
    resp.status = '404 NOT FOUND'
    resp.headers["test"] = "make_response"
    return resp

注: status状态码需要是完整的描述 比如: 200 ok; 404 Not Found;

效果:

10.4.3 Cookie

cookie只能通过make_response的方式进行设置

其实本质上就是将cookie设置到响应头里,响应头里有个set-cookie的header,浏览器收到这个header后就会将header的cookie存储在浏览器端,在下次发起该域的请求时携带该cookie

from flask import Flask, make_response

app = Flask(__name__)


@app.route("/set_cookie")
def set_cookie():
    resp = make_response("set-cookie")
    resp.set_cookie("test-cookie", "cookie")
    return resp

效果:

同样,有设置cookie,就有获取cookie,删除cookie

获取cookie无需多说,通过request对象可以获取cookie的值

删除cookie需要调用make_response对象的删除cookie的方法, 删除cookie的原理其实还是set-cookie,只不过将该cookie的有效期设置到1970年,这样该cookie就会自动过期

from flask import Flask, make_response, request

app = Flask(__name__)


@app.route("/set_cookie")
def set_cookie():
    resp = make_response("set-cookie")
    resp.set_cookie("test-cookie", "cookie")
    return resp


@app.route("/get_cookie")
def get_cookie():
    return request.cookies.get("test-cookie")


@app.route("/delete_cookie")
def delete_cookie():
    resp = make_response("test-delete-cookie")
    resp.delete_cookie("test-cookie")
    return resp

效果:

获取cookie

删除cookie:

再次查看cookie

cookie已经被删除,返回None报错.

10.4.5 Session

flask的session是存储在浏览器端的,像cookie一样

注: session的使用必须配置SECRET_KEY,没有此参数session无法设置

from flask import Flask, session

app = Flask(__name__)

app.secret_key = "123"


@app.route("/create_session")
def create_session():
    session["test-session"] = "test=session"
    return "test-session"


@app.route("/get_session")
def get_session():
    return session.get("test-session")

效果:

可以看到session其实是像cookie一样保存在浏览器端了, 而secret_key的作用就是对session进行加密,防止泄露敏感信息

get_session效果: