गुप्त कुंजी फ्लास्क सत्र में सेट नहीं है, फ्लास्क-सत्र एक्सटेंशन का उपयोग करते हुए


83

अभी मैं एक फ्लास्क 3 पार्टी लाइब्रेरी फ्लास्क-सेशन का उपयोग कर रहा हूं और मुझे काम करने का कोई मौका नहीं मिल रहा है।

जब मैं अपनी साइट से जुड़ता हूं, तो मुझे निम्नलिखित त्रुटि मिलती है:

RuntimeError: सत्र अनुपलब्ध है क्योंकि कोई गुप्त कुंजी सेट नहीं की गई थी। कुछ अनूठा और गुप्त करने के लिए आवेदन पर secret_key सेट करें।

नीचे मेरा सर्वर कोड है।

from flask import Flask, session
from flask.ext.session import Session

SESSION_TYPE = 'memcache'

app = Flask(__name__)
sess = Session()

nextId = 0

def verifySessionId():
    global nextId

    if not 'userId' in session:
        session['userId'] = nextId
        nextId += 1
        sessionId = session['userId']
        print ("set userid[" + str(session['userId']) + "]")
    else:
        print ("using already set userid[" + str(session['userId']) + "]")
    sessionId = session.get('userId', None)
    return sessionId

@app.route("/")
def hello():
    userId = verifySessionId()
    print("User id[" + str(userId) + "]")
    return str(userId)

if __name__ == "__main__":
    app.secret_key = 'super secret key'

    sess.init_app(app)

    app.debug = True
    app.run()

जैसा कि आप देख सकते हैं, मैं ऐप सीक्रेट कुंजी सेट करता हूं। मैं क्या गलत कर रहा हूं?

क्या अन्य सत्र विकल्प हैं?

अन्य जानकारी: लिनक्स मिंट पर पायथन 2.7 चलाना

पूरा पेस्ट:

Traceback (most recent call last):
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/sean/code/misc/session/sessiontest.py", line 27, in hello
    userId = verifySessionId()
  File "/home/sean/code/misc/session/sessiontest.py", line 16, in verifySessionId
    session['userId'] = nextId
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/werkzeug/local.py", line 341, in __setitem__
    self._get_current_object()[key] = value
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/sessions.py", line 126, in _fail
    raise RuntimeError('the session is unavailable because no secret '
RuntimeError: the session is unavailable because no secret key was set.  Set the secret_key on the application to something unique and secret.

अपवाद का पूर्ण ट्रेसबैक क्या है ?
मार्टिन पीटर्स

और आप किस संस्करण का Flask-Sessionउपयोग कर रहे हैं? मुझे वर्तमान प्रोजेक्ट स्रोत में उस अपवाद का कोई संदर्भ नहीं मिल रहा है ।
मार्टिन पीटर्स

@MartijnPieters किसी भी विचार मैं कैसे समझ सकता है? मैंने अभी इसके लिए एक पाइप स्थापित किया था
मिन्टीअन्ट

पहले से अपवाद संदेश मिला; यह फ्लास्क में ही है, फ्लास्क-सेशन में नहीं।
मार्टिन पीटर्स

@MartijnPieters मैंने पूर्ण ट्रेसबैक जोड़ा। ऐसा लगता है जब मैं 'userId' कुंजी को सेट करने का प्रयास करता हूं, जैसा कि आप देख सकते हैं
MintyAnt

जवाबों:


96

आपके मामले में अपवाद NullSessionInterfaceसत्र कार्यान्वयन द्वारा उठाया जाता है , जो कि फ्लास्क-सत्र का उपयोग करते समय डिफ़ॉल्ट सत्र प्रकार होता है। ऐसा इसलिए है क्योंकि आप कभी भी फ्लास्क को SESSION_TYPEकॉन्फ़िगरेशन नहीं देते हैं ; यह अपने मॉड्यूल में एक वैश्विक के रूप में स्थापित करने के लिए पर्याप्त नहीं हैकुप्पी के सत्र त्वरित प्रारंभ उदाहरण कोड एक वैश्विक सेट करता है, लेकिन फिर फोन करके एक विन्यास वस्तु के रूप में वर्तमान मॉड्यूल का उपयोग करता है ।app.config.from_object(__name__)

यह डिफ़ॉल्ट फ्लास्क 0.10 या नए के साथ बहुत अर्थ नहीं रखता है; NullSessionफ्लास्क 0.8 या 0.9 के साथ इसका अर्थ हो सकता है, लेकिन वर्तमान संस्करण में flask.session.NullSessionकक्षा को त्रुटि संकेत के रूप में उपयोग किया जाता है। आपके मामले में यह आपको अब गलत त्रुटि संदेश देता है।

SESSION_TYPEकॉन्फ़िगरेशन विकल्प को कुछ और पर सेट करें । में से एक उठाओ redis, memcached, filesystemया mongodb, और में यह तैयार करना न भूलें app.config(प्रत्यक्ष या के माध्यम से विभिन्न Config.from_*तरीकों )।

एक त्वरित परीक्षण के लिए, इसे स्थापित करना filesystemसबसे आसान है; अतिरिक्त निर्भरता के बिना उस काम को करने के लिए पर्याप्त डिफ़ॉल्ट कॉन्फ़िगरेशन है:

if __name__ == "__main__":
    app.secret_key = 'super secret key'
    app.config['SESSION_TYPE'] = 'filesystem'

    sess.init_app(app)

    app.debug = True
    app.run()

यदि आप इस त्रुटि को देखते हैं और आप फ्लास्क-सत्र का उपयोग नहीं कर रहे हैं , तो गुप्त सेट करने में कुछ गड़बड़ हो गई है। यदि आप सेट कर रहे हैं app.config['SECRET_KEY']या ऊपर दिए app.secret_keyगए किसी if __name__ == "__main__":गार्ड की तरह हैं और आपको यह त्रुटि मिलती है, तो आप शायद एक WSGI सर्वर के माध्यम से अपना फ्लास्क ऐप चला रहे हैं, जो आपके फ्लास्क प्रोजेक्ट को मॉड्यूल के रूप में आयात करता है , और __name__ == "__main__"ब्लॉक कभी नहीं चलता है।

वैसे भी एक अलग फ़ाइल में फ्लास्क ऐप्स के लिए कॉन्फ़िगरेशन को प्रबंधित करना हमेशा बेहतर होता है।


3
ध्यान दें कि प्रयोग app.secret_keyकरना बुरा व्यवहार है। app.configऑब्जेक्ट के माध्यम से गुप्त कुंजी सेट करने के लिए बेहतर है , जो आपको बाहरी फ़ाइल में कॉन्फ़िगरेशन को लोड करने में सक्षम बनाता है।
मिगुएल

4
यहाँ समाप्त होने वाले हरोकू उपयोगकर्ताओं पर ध्यान दें: जब तक मैं ब्लॉक से app.secret_key = ...बाहर नहीं निकला तो मुझे यहाँ काम करने के लिए उदाहरण नहीं मिला - जो कि हिंडोइट में समझ में आता है क्योंकि हरोकू एप को गीकॉर्न के माध्यम से चलाता है, जिसका अर्थ है कि if __name__ == "__main__":ब्लॉक कभी दर्ज नहीं किया गया है।
पास्कल

'अगर नाम के बाहर गुप्त कुंजी सेट करें ==' मुख्य ':' यहाँ stackoverflow.com/users/2900124/hayden द्वारा उत्तर नीचे एक बेहतर उत्तर है (होस्ट किए गए सर्वर पर काम किया है, जबकि यह एक नहीं किया गया)
ng10

@ ng10: जब आप फ्लास्क-सत्र का उपयोग नहीं कर रहे हैं तो यह उत्तर लागू होता है । यहां प्रश्न में समस्या यह है कि फ्लास्क-सत्र का उपयोग करते समय आप जो त्रुटि संदेश देखते हैं वह सहायक और गलत नहीं है। यदि आप फ्लास्क-सत्र का उपयोग नहीं करते समय त्रुटि संदेश देखते हैं , तो दूसरा उत्तर लागू हो सकता है। मैंने दोनों विकल्पों को संबोधित करने का उत्तर अपडेट कर दिया है।
मार्टिन पीटर्स

1
@ यामाई: जिसे फ्लास्क-सेशन कॉन्फ़िगरेशन सेक्शन का दस्तावेज दिया गया है ; mongodb के लिए, डिफ़ॉल्ट डेटाबेस नाम है flask_session, और डिफ़ॉल्ट संग्रह कहा जाता है sessions
मार्टिन पीटर्स

59

के बाहर गुप्त कुंजी सेट करें if __name__ == '__main__':

app.py:

from flask import Flask, session

app = Flask(__name__)
app.secret_key = "super secret key"

@app.route("/")
...

if __name__ == '__main__':
    app.debug = True
    app.run()

जब आप ब्लॉक चलाकर अपना ऐप शुरू करते हैं flask runतो if __name__ == '__main__':ब्लॉक हो जाता है। यदि आप इसे छोड़ना नहीं चाहते हैं, तो साथ चलाएं python app.py


मैं Google कैलेंडर जानकारी का उपयोग करने के लिए oauth2.0 का उपयोग करके एक amazon ec2 apache2 Ubuntu सर्वर पर एक फ्लास्क ऐप चला रहा हूं। यह उत्तर सरल संशोधन है जिसने इसे काम किया है। धन्यवाद!
जस

यह एक अलग प्रश्न का उत्तर है , एक जहां सत्र प्रकार को सही ढंग से कॉन्फ़िगर किया गया है या आप फ्लास्क-सत्र का उपयोग नहीं कर रहे हैं, लेकिन कोई रहस्य निर्धारित नहीं किया गया है क्योंकि WSGI सर्वर ने मॉड्यूल को आयात के साथ लोड किया है और न कि आयात के रूप में। मुख्य स्क्रिप्ट।
मार्टिन पीटर्स

14

इसे इस्तेमाल करे:

app = Flask(__name__)
app.config['SESSION_TYPE'] = 'memcached'
app.config['SECRET_KEY'] = 'super secret key'
sess = Session()

और app.secret_keyसबसे नीचे अपना असाइनमेंट निकालें ।


मैंने इसे एक शॉट दिया, कोई भाग्य नहीं, वही त्रुटि। यदि आप चाहें तो मैं पदों का कोड अपडेट कर सकता हूं
मिन्टीअन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.