Flask-Session 확장을 사용하여 플라스크 세션에 비밀 키가 설정되지 않았습니다.


83

지금은 플라스크 타사 라이브러리 Flask-Session을 사용 하고 있으며 세션이 작동하는 데 운이 없습니다.

내 사이트에 연결할 때 다음 오류가 발생합니다.

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()

보시다시피 앱 비밀 키를 설정했습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

다른 세션 옵션이 있습니까?

기타 정보 : Linux Mint에서 Python 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.

예외 의 전체 역 추적 은 무엇입니까 ?
Martijn Pieters

그리고 어떤 버전 Flask-Session을 사용하고 있습니까? 현재 프로젝트 소스 에서 해당 예외에 대한 참조를 찾을 수 없습니다 .
Martijn Pieters

@MartijnPieters 내가 어떻게 알아낼 수 있는지 아십니까? 방금 pip 설치를했습니다
MintyAnt 2014 년

이미 예외 메시지를 찾았습니다. Flask-Session이 아닌 Flask 자체에 있습니다.
Martijn Pieters

@MartijnPieters 전체 역 추적을 추가했습니다.
보시다시피

답변:


96

귀하의 경우에는 Flask-Session을 사용할 때 기본 세션 유형 인NullSessionInterface 세션 구현에 의해 예외가 발생합니다 . 이는 실제로 Flask에 구성 제공하지 않기 때문입니다 . 모듈에서 전역으로 설정하는 것만 으로 는 충분하지 않습니다 . 형틀 세션 빠른 예 코드 전역을 설정하지만, 다음 호출하여 구성 오브젝트로서 현재 모듈을 이용 않는다 .SESSION_TYPEapp.config.from_object(__name__)

이 기본값은 Flask 0.10 이상에서는 의미가 없습니다. NullSessionFlask 0.8 또는 0.9에서는 의미가있을 수 있지만 현재 버전에서는 flask.session.NullSession클래스 가 오류 신호로 사용됩니다. 귀하의 경우에는 이제 잘못된 오류 메시지가 표시됩니다.

SESSION_TYPE구성 옵션을 다른 것으로 설정하십시오 . 중 하나를 선택 redis, memcached, filesystemmongodb, 그리고 그것을 설정해야합니다 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()

이 오류가 표시되고 Flask-Session을 사용 하지 않는 경우 비밀 설정에 문제가있는 것입니다. 당신이 설정하는 경우 app.config['SECRET_KEY']또는 app.secret_keyA의 if __name__ == "__main__":위 같은 가드와이 오류를 얻을, 당신은 아마 수입하여 플라스크 프로젝트를하는 WSGI 서버를 통해 플라스크 응용 프로그램을 실행하는 모듈로 , 그리고 __name__ == "__main__"블록이 실행되지 않습니다.

어쨌든 별도의 파일에서 Flask 앱의 구성관리하는 것이 항상 더 좋습니다 .


3
사용 app.secret_key은 나쁜 습관입니다. app.config구성을 외부 파일로 오프로드 할 수 있도록 개체를 통해 비밀 키를 설정하는 것이 더 좋습니다.
미구엘

4
여기서 끝나는 Heroku 사용자에 대한 참고 사항 : if 블록에서 app.secret_key = ...벗어날 때까지 여기에서 예제를 사용하지 못했습니다. 이는 Heroku가 gunicorn을 통해 앱을 실행하므로 블록이 입력되지 않았 음 을 의미합니다 . if __name__ == "__main__":
Pascal

'if name ==' main ':' 외부에서 비밀 키를 설정하십시오 . 아래의 stackoverflow.com/users/2900124/hayden 의 답변 이 더 나은 답변입니다 (호스팅 된 서버에서 작동했지만 이건 그렇지 않았습니다)
ng10

@ ng10 :이 대답은 Flask-Session을 사용하지 않을 때 적용됩니다 . 여기서 문제는 Flask-Session을 사용할 때 표시되는 오류 메시지가 유용하지 않고 잘못되었다는 것입니다. Flask-Session을 사용 하지 않을 때 오류 메시지가 표시되면 다른 답변이 적용될 수 있습니다. 두 가지 옵션을 모두 해결하기 위해 답변을 업데이트했습니다.
Martijn Pieters

1
@iamai : Flask-Session 구성 섹션에 문서화되어 있습니다 . mongodb의 경우 기본 데이터베이스 이름은 flask_session이고 기본 컬렉션은 sessions입니다.
Martijn Pieters

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 서버에서 flask 앱을 ​​실행하고 있습니다. 이 대답은 그것이 작동하도록 만든 간단한 수정입니다. 감사합니다!
jas

이것은 세션 유형이 올바르게 구성되었거나 Flask-Session을 전혀 사용하지 않는 다른 질문에 대한 대답입니다 . 메인 스크립트.
Martijn Pieters

14

이 시도:

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

그리고 app.secret_key하단에서 과제를 제거하십시오 .


나는 이것을 기회, 행운, 같은 오류를 주었다. 원하는 경우 게시물 코드를 업데이트 할 수 있습니다
MintyAnt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.