簡體   English   中英

使用Flask會話時出現內部服務器錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM