#python #django #session #django-channels
#python #django #сессия #django-каналы
Вопрос:
Я работаю над любимым проектом на django1.10, экспериментируя с каналами. У меня есть промежуточное программное обеспечение, и я хочу импортировать и подключить его к myapp.Я хочу, чтобы параметры ‘ip’, ‘user_agent’, ‘session_key’ из промежуточного программного обеспечения подключались к моему channel/sessions.py . Поскольку я все еще разбираюсь в python и django, я признателен за любую помощь в том, как подключить мой класс промежуточного программного обеспечения SessionMiddleware к моему channels/sessions.py .
Соответствующий код для промежуточного программного обеспечения:
class SessionMiddleware(MiddlewareMixin):
"""
Middleware that provides ip and user_agent to the session store.
"""
def process_request(self, request):
engine = import_module(settings.SESSION_ENGINE)
session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)
request.session = engine.SessionStore(
ip=request.META.get('REMOTE_ADDR', ''),
user_agent=request.META.get('HTTP_USER_AGENT', ''),
session_key=session_key
)
Каналы / сеансы.py — это:
def inner(message, *args, **kwargs):
# Make sure there's NOT a http_session already
if hasattr(message, "http_session"):
return func(message, *args, **kwargs)
try:
# We want to parse the WebSocket (or similar HTTP-lite) message
# to get cookies and GET, but we need to add in a few things that
# might not have been there.
if "method" not in message.content:
message.content['method'] = "FAKE"
request = AsgiRequest(message)
except Exception as e:
raise ValueError("Cannot parse HTTP message - are you sure this is a HTTP consumer? %s" % e)
# Make sure there's a session key
session_key = request.GET.get("session_key", None)
if session_key is None:
session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)
# Make a session storage
if session_key:
session_engine = import_module(settings.SESSION_ENGINE)
session = session_engine.SessionStore(session_key=session_key,user_agent=user_agent,ip=ip)
else:
session = None
message.http_session = session
# Run the consumer
result = func(message, *args, **kwargs)
# Persist session if needed (won't be saved if error happens)
if session is not None and session.modified:
session.save()
return result
return inner
Вопрос может быть тривиальным, требующим понимания базового импорта класса / функции python.Я смог импортировать модуль и класс SessionMiddleware; Я попытался определить ‘ip’, ‘user_agent’ и ‘session_key’ как глобальные переменные в channels/sessions.py (вероятно, что-то упустил, потому что я получаю сообщение об ошибке):
Ошибка имени: имя ‘user_agent’ не определено.
` когда я пытаюсь назначить ‘session’ в операторе if в #Make хранилище сеансов в channels/sessions.py:
session =session_engine .SessionStore(session_key=session_key,user_agent=user_agent,ip=ip)
Мне трудно понять следующее: 1. Каков pythonic способ вызова параметров ‘ip’, ‘user_agent’ и ‘session_key’ для моего channels/sessions.py . 2. Как я могу сделать так, чтобы эти параметры имели глобальную область видимости в channels/sessions.py .
Комментарии:
1. Пожалуйста, поделитесь с нами кодом и потоком для лучшего решения. Где вы используете эту строку в коде ‘session =session_engine. SessionStore(session_key=session_key,user_agent=user_agent,ip = ip)’ Пожалуйста, поделитесь обоими фрагментами кода. Ваш класс промежуточного программного обеспечения и сеансы. py-код.