[英]Internal Server Error when using Flask session
我想使用Flask session
cookie在請求之間保存ID,但是當我執行請求時,我收到Internal Server Error
。
我制作了一個簡單的Flask應用程序原型來演示我的問題:
#!/usr/bin/env python
from flask import Flask, session
app = Flask(__name__)
@app.route('/')
def run():
session['tmp'] = 43
return '43'
if __name__ == '__main__':
app.run()
為什么我在執行請求時無法使用以下值存儲session
cookie?
根據Flask會議文件 :
...這意味着用戶可以查看cookie的內容但不能修改它,除非他們知道用於簽名的密鑰。
要使用會話,您必須設置密鑰 。
設置密鑰 。 你應該返回字符串,而不是int。
#!/usr/bin/env python
from flask import Flask, session
app = Flask(__name__)
@app.route('/')
def run():
session['tmp'] = 43
return '43'
if __name__ == '__main__':
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
app.run()
正如@falsetru所提到的,你必須設置一個密鑰。
在發送之前session
cookie發送到用戶的瀏覽器,瓶簽餅干加密,而這並不意味着你不能解碼的cookie。 我認為Flask會跟蹤簽名的cookie,因此它可以執行它自己的“魔術”,以確定與請求一起發送的cookie(請求標頭)是否是有效的cookie。
您可能使用的一些方法,都與Flask類實例相關,通常定義為app
:
為app
對象定義secret_key
變量
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'import os; 打印(os.urandom(16))”
b'_5#Y2L“F4Q8z \\ n \\ XEC] /”
請注意
正如您所看到的,Flask的創建者支持使用
os.urandom()
來構建Flask密鑰,從舊版本的工具到最新版本。 那么:為什么@ joshlsullivan的回答得到了downvotes(值得一個upvote)以及為什么@MikhailKashkin寫道,使用os.urandom()
是一個可怕的想法,是神秘的。
在app = Flask(__name__)
放置: app.secret_key = os.urandom(24)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.