Я слежу за серией видеороликов для ознакомления, поскольку я создаю серверную часть своего первого веб-сайта, используя Flask. В одном из видеороликов я дословно написал эту функцию для использования в качестве декоратора:
# add this as a decorator to pages that require a login
def login_required(f):
@wraps(f)
def wrap(*args, **kwargs):
if 'logged_in' in session:
return f(*args, **kwargs)
else:
flash('You need to login.')
return redirect(url_for('login'))
return wrap
, который используется для перенаправления на логин, если этого требует страница. Это отлично работает при тестировании приложения с использованием python3 -m flask run
, но я получаю внутреннюю ошибку сервера со следующей трассировкой стека при запуске gunicorn main:main
[2020-07-13 18:33:52 -0400] [6272] [INFO] Listening at: http://127.0.0.1:8000 (6272)
[2020-07-13 18:33:52 -0400] [6272] [INFO] Using worker: sync
[2020-07-13 18:33:52 -0400] [6274] [INFO] Booting worker with pid: 6274
[2020-07-13 18:33:59 -0400] [6274] [ERROR] Error handling request /
Traceback (most recent call last):
File "/usr/local/lib/python3.8/dist-packages/gunicorn/workers/sync.py", line 134, in handle
self.handle_request(listener, req, client, addr)
File "/usr/local/lib/python3.8/dist-packages/gunicorn/workers/sync.py", line 175, in handle_request
respiter = self.wsgi(environ, resp.start_response)
File "/home/john/Developer/runjs/main.py", line 15, in wrap
if 'logged_in' in session:
File "/home/john/.local/lib/python3.8/site-packages/werkzeug/local.py", line 379, in <lambda>
__contains__ = lambda x, i: i in x._get_current_object()
File "/home/john/.local/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
return self.__local()
File "/home/john/.local/lib/python3.8/site-packages/flask/globals.py", line 38, in _lookup_req_object
raise RuntimeError(_request_ctx_err_msg)
RuntimeError: Working outside of request context.
Я не уверен, что именно не так с моим функция, которая вызывает его поломку при прохождении через Gunicorn. Я попытался изучить это, но ни одно из предложенных исправлений не показалось подходящим для моего конкретного сценария c, и я не понимаю, почему он работает локально.