正如@falsetru提到的,您必须设置一个密钥。
在将session
cookie 发送到用户的浏览器之前,Flask 会对 cookie 进行加密签名,这并不意味着您无法解码 cookie。我认为 Flask 会跟踪签名的 cookie,因此它可以执行它自己的“魔术”,以确定与请求(请求标头)一起发送的 cookie 是否是有效的 cookie。
您可能使用的一些方法,都与 Flask 类实例相关,一般定义为app
:
为对象定义secret_key
变量app
app.secret_key = b'6hc/_gsh,./;2ZZx3c6_s,1//'
使用config()
方法
app.config['SECRET_KEY'] = b'6hc/_gsh,./;2ZZx3c6_s,1//'
为整个 Flask 应用程序使用外部配置文件
$ grep pyfile app.py
app.config.from_pyfile('flask_settings.cfg')
$ cat flask_settings.py
SECRET_KEY = b'6hc/_gsh,./;2ZZx3c6_s,1//'
这是一个例子(改编自本文),重点是提供更清晰的 Flask session
cookie 图片,考虑到客户端和服务器端的参与:
from flask import Flask, request, session
import os
app = Flask(__name__)
@app.route('/')
def f_index():
# Request Headers, sent on every request
print("\n\n\n[Client-side]\n", request.headers)
if 'visits' in session:
# getting value from session dict (Server-side) and incrementing by 1
session['visits'] = session.get('visits') + 1
else:
# first visit, generates the key/value pair {"visits":1}
session['visits'] = 1
# 'session' cookie tracked from every request sent
print("[Server-side]\n", session)
return "Total visits:{0}".format(session.get('visits'))
if __name__ == "__main__":
app.secret_key = os.urandom(24)
app.run()
这是输出:
$ python3 sessions.py
* Serving Flask app "sessions" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
[Client-side]
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Connection: keep-alive
Host: 127.0.0.1:5000
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.5
[Server-side]
<SecureCookieSession {'visits': 1}>
127.0.0.1 - - [12/Oct/2018 14:27:05] "GET / HTTP/1.1" 200 -
[Client-side]
Upgrade-Insecure-Requests: 1
Cookie: session=eyJ2aXNpdHMiOjF9.DqKHCQ.MSZ7J-Zicehb6rr8qw43dCVXVNA # <--- session cookie
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Connection: keep-alive
Host: 127.0.0.1:5000
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.5
[Server-side]
<SecureCookieSession {'visits': 2}>
127.0.0.1 - - [12/Oct/2018 14:27:14] "GET / HTTP/1.1" 200 -
您可能已经注意到,在上面的示例中,我使用os
lib 和urandom()
函数来生成 Flask 的密钥,对吧?
来自官方文档:
如何生成好的密钥
密钥应尽可能随机。您的操作系统有办法基于加密随机生成器生成相当随机的数据。使用以下命令快速生成 Flask.secret_key(或 SECRET_KEY)的值:
$ python -c '导入操作系统;打印(os.urandom(16))'
b'_5#y2L"F4Q8z\n\xec]/'
加注
如您所见,Flask 的创建者支持使用os.urandom()
构建 Flask 密钥的做法,从该工具的旧版本到最新版本。所以:为什么@joshlsullivan 的回答收到了反对票(值得赞成)以及为什么@MikhailKashkin写道,使用os.urandom()
是个糟糕的主意,是个谜。