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

17

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

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

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

    
задан Abe 08.06.2012 в 16:06
источник

3 ответа

6

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

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

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.     

ответ дан Chris Pratt 08.06.2012 в 16:50
источник
34

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

@decorators.login_required(redirect_field_name=None)
    
ответ дан Danosaure 07.10.2012 в 00:35
источник
0
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))
    
ответ дан electrocoder 01.06.2014 в 18:29
источник