Подтвердить что ты не робот

Подавить "? Next = blah" поведение в django login_required decorator

Я люблю django @login_required decorator, но есть одна вещь, которую я не могу понять, как это сделать.

Если пользователь, не прошедший проверку подлинности, пытается посещать страницу @login_required (например, "/private-stuff/" ), я хочу отбросить их на домашнюю страницу (например, "/home/" ). Но я не хочу добавлять аргумент "? Next =" к URL-адресу. Другими словами, я просто хочу перенаправить на "/home/", а не "/home/? Next =/private-stuff/".

Как я могу это сделать? Есть ли лучший способ, чем просто написать собственный декоратор?

4b9b3361

Ответ 1

Хорошо, есть два способа, о которых я могу думать. Во-первых, это был бы "правильный" способ в том смысле, что вы не нарушаете никаких функциональных возможностей, добавляя только новые функции: создайте свой собственный декоратор login_required. Проблема в том, что Django действительно заправил перенаправление после входа в систему, и для этого требуется много деталей. login_required decorator на самом деле просто обертка вокруг декоратора user_passes_test, который, в свою очередь, вызывает redirect_to_login view, и это представление, которое добавляет параметр next к querystring. В вашем обычном декораторе вы можете перевернуть все или некоторые из этих функций прямо в декоратор, но вам нужно будет ссылаться на все три для необходимого кода.

Другим и более простым вариантом является создание некоторого промежуточного программного обеспечения для удаления строки запроса, если она установлена:

from django.conf import settings
from django.http import HttpResponseRedirect

class RemoveNextMiddleware(object):
    def process_request(self, request):
        if request.path == settings.LOGIN_URL and request.GET.has_key('next'):
            return HttpResponseRedirect(settings.LOGIN_URL)

И затем добавьте путь импорта к этому промежуточному программному обеспечению в MIDDLEWARE_CLASSES. Помните, что на этапе запроса промежуточное программное обеспечение обрабатывается сначала до последнего или сверху вниз, другими словами. Это должно быть относительно рано на этапе запроса, но вам может понадобиться немного поиграть с ним, чтобы увидеть, что может и не может прийти раньше.

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

Ответ 2

Не просто ли это:

@decorators.login_required(redirect_field_name=None)

Ответ 3

login(request, user)
if request.POST['next']:
    return redirect(request.POST['next'])
else:
    msg = u"Welcome..."
    return render_to_response('members/welcome.html', {'msg':msg},
                                              context_instance=RequestContext(request))