2014-02-14 4 views
0

Предположим, я создал промежуточное программное обеспечение, которое должно перенаправить пользователя после входа в систему с помощью «следующего» параметра, взятого из LOGIN_REDIRECT_URL. Но он должен делать это только один раз сразу после регистрации, а не с каждым запросом до LOGIN_REDIRECT_URL. На данный момент я проверяю User.last_login и сравниваю его с datetime.datetime.now(), но, похоже, это не разумное решение. Любые лучшие идеи?Django Middleware, одно действие после входа в систему

+0

Вы можете посмотреть референт. 'HTTP_REFERER' – karthikr

+1

промежуточное ПО ловит все запросы, почему вы не используете представление? – vadimchin

+0

@vadimchin Мне нужно промежуточное ПО, потому что я хочу позволить авторизованным пользователям делать бесплатные шаги вокруг «зарегистрированной области», поэтому я создаю «посетителя» в промежуточном программном обеспечении, и когда он пытается просмотреть любой из «зарегистрированных областей», я хочу для отображения представления с уведомлением. Я мог бы сделать декоратор к просмотру «logged area», но я хочу, чтобы все это было в промежуточном программном обеспечении. – mdargacz

ответ

0

мне удалось решить эту проблему. Я создал сигнал для действия user_logged_in, который добавляет переменную redirect_me=True. То что я имел все тот же запрос в middleware, я мог проверить его и сделать и redirct. Вот пример кода здесь:
signals.py: из django.contrib.auth.signals импорта USER_LOGGED_IN

def do_stuff(sender, user, request, **kwargs): 
    if getattr(request, 'user', None) and not request.user.is_superuser: 
     request.do_stuff = True 

models.py (вы также можете поместить его в инициализации .py или другой файл, выполняется сначала на 'runserver'):

from django.contrib.auth.signals import user_logged_in 
user_logged_in.connect(do_stuff) 

middleware.py:

класс PrimordialAdvertMiddleware (объект):

def process_response(self, request, response): 
     if getattr(request, 'do_stuff', None): 
      return do_some_other_stuff() 
     return response 

Вы также выполняете действие process_request. Я надеюсь, что это поможет кому-то в будущем.

0

Возможно, вам стоит попробовать использовать user_logged_in вместо промежуточного программного обеспечения?

Также вы можете проверить объект пользователя из запроса на is_anonymous, может быть, это может помогает

+0

Не сигналы, которые должны запускать действия в фоновом режиме? как я могу перенаправить пользователя на URL внутри сигнала? Кроме того, я проверяю объект пользователя на запрос, но я хочу перенаправить ONCE, только после входа в систему. – mdargacz