Django change request.path в промежуточном ПО (для аутентификации по токену в URL) - PullRequest
3 голосов
/ 06 ноября 2011

Дорогие вездесущие существа в Stackoverflow,

В Django 1.3 я создаю промежуточное программное обеспечение process_request, которое получает токен из URL-адреса, регистрирует пользователя (если оно верно) и удаляет токен из URL-адреса.Однако:

I) Django рекомендует не получать доступ к данным POST / GET в промежуточном программном обеспечении, я не совсем уверен, почему так ... То же самое относится к request.path?https://docs.djangoproject.com/en/dev/topics/http/middleware/#process-view

II) Я хочу удалить токен из URL, поэтому /album3/pic42/~53Cr3t70K3n/like/ -> /album3/pic42/like/.Однако изменение request.path не работает.Страница не будет найдена, в то время как

  • Промежуточное программное обеспечение работает правильно (проверено печатью)

  • Непосредственный ввод /album3/pic42/like/ работает

  • Ошибка (с токеном) показывает Request URL: http://www.site.com/album3/pic42/like/

Есть ли исправление или я подхожу к этому с неправильного угла?

Заранее спасибо!

Я только что понял, что для того, чтобы изменить его на стороне клиента, очевидно, мне нужен редирект (почему я об этом не подумал ...).Тем не менее, было бы полезно иметь возможность переписать его только на стороне сервера без нового запроса, например, для доступа к персонализированному изображению.


Ps: дополнительные сведения, если необходимо, не стесняйтесь пропускать

Я работаю над сайтом, который (будет) отправлять персонализированные электронные письма пользователям.Я бы хотел, чтобы пользователи могли нажимать на ссылки в письме и автоматически входить в систему с помощью токена в ссылке на электронную почту.Это в дополнение к обычному входу в систему.(Я знаю, что это менее безопасно, потому что люди могут пересылать электронную почту, но этого достаточно для моего сайта).URL-адрес будет выглядеть примерно так: / album3 / pic42 / ~ 53Cr3t70K3n / like / (с http://www.site.com раздетым, это делает Django)

Я пишу промежуточное программное обеспечение, чтобы соответствовать этому и войти в систему пользователяв случае необходимости, сервер аутентификации для принятия токена в качестве действительных учетных данных и модель токена.


Функция промежуточного программного обеспечения process_request: def process_request (self, request):

    if '/~' in request.path:
        result = re.search('(.*)/~(.+?)/(.*)', request.path)
        (uidb36, token) = result.group(2).split('-', 2)
        user = authenticate(uidb36 = uidb36, token = token)
        if user: login(request, user)
        return HttpResponseRedirect('%s/%s' % (result.group(1), result.group(3)) + ('?' + '&'.join('='.join(item) for item in request.GET.items()) if request.GET else ''))
    return None

Rightтеперь он работает с перенаправлениями, я бы тоже хотел сделать это внутренне.

Ответы [ 2 ]

2 голосов
/ 07 ноября 2011

Если вы не хотите возиться с обработчиками загрузки , у меня есть лучшее решение для вас:

  1. Создайте правило в своемurls.py, чтобы специально отследить посещения с помощью токенов

    . Поставьте его в начале urlpatterns, чтобы убедиться, что он будет оцениваться первым.Примерно так будет:

    (r'/~', 'my_app_name.my_redirect_view'),
    
  2. Создать представление :

    def my_redirect_view(request):
        #Compiled regular expressions work much faster
        beloved_tokens = re.compile(r'(.*)/~(.+?)/(.*)')
        result = beloved_tokens.search(request.path)
        try:
            (uidb36, token) = result.group(2).split('-', 2)
            path_end = result.group(3)
        # We use "try" to be sure that no one had
        # messed with our beloved tokens:
        except AttributeError: 
            raise Http404
        else:
            user = authenticate(uidb36 = uidb36, token = token)
            if user: 
                login(request, user)
                return HttpResponseRedirect('%s/%s' % (result.group(1), result.group(3)) + ('?' + '&'.join('='.join(item) for item in request.GET.items()) if request.GET else ''))
            else:
                raise Http404
    
1 голос
/ 07 ноября 2011

IMO изменение request.path является более плохим (если его можно назвать плохим) по сравнению с доступом к параметрам GET / POST, поэтому просто передайте токен как параметр GET и войдите в систему на основе токена и не перенаправляйте и не изменяйте request.path

Я вижу токен как добавленный атрибут к действительному URL, следовательно, промежуточное ПО признает это и делает что-то с этим токеном, но URL все еще обрабатывается правильным представлением, поэтому промежуточное ПО мне кажется здесь очень логичным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...