Как вызвать и определить переменную в методе в другом (импортированном) классе промежуточного программного обеспечения?

#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-код.