Django: Tweaking @login required

Chcę rozpocząć prywatną wersję Beta dla mojej strony. Mam stronę powitalną, na której użytkownik może wprowadzić kod, aby następnie uzyskać dostęp do reszty witryny. Obecnie wszystkie pozostałe strony witryny (z wyjątkiem strony powitalnej) składają się z serii przekierowań skonfigurowanych przez wymagającego logowania użytkownika (poprzez @login_required decorator).

Chcę, aby zarówno zalogowani użytkownicy, jak i osoby, które wprowadzą Kod Beta testera, miały dostęp do reszty strony. To znaczy, że nie mogę używać dekoratora do wszystkich moich poglądów.

Czy powinienem zmienić sam dekorator @ login_required? Bardziej skusiłem się na wykonanie następujących czynności (dodałem zmienną sesji, jeśli użytkownik wprowadzi poprawny kod na stronie splash).

def view_name(request):
    user=request.user  
    if not user.id or not request.session.get('code_success'):
           return HttpResponseRedirect('/splash/')
Czy to wydaje się rozsądne? I ' d hate to have to repeat it for all my views

Brendan

Author: Srikar Appalaraju, 2011-04-15

4 answers

Napisz własny dekorator-to dość proste. W rzeczywistości, jeśli spojrzysz na źródło Django dla login_required, powinieneś być w stanie bawić się kopią dla własnych celów.

def my_login_required(function):
    def wrapper(request, *args, **kw):
        user=request.user  
        if not (user.id and request.session.get('code_success')):
            return HttpResponseRedirect('/splash/')
        else:
            return function(request, *args, **kw)
    return wrapper
 24
Author: Steve Mayne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-31 08:28:47

Zalecałbym zamiast tego użycie oprogramowania pośredniczącego. Ułatwi to przejście z prywatnej bety. Na djangonsippets jest kilka przykładów wymaganych loginów:

Http://djangosnippets.org/snippets/1220/
http://djangosnippets.org/snippets/136/

Polecam wziąć jeden z nich i poprawić go, aby uwzględnić logikę kodu beta.

 4
Author: Mark Lavin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-15 15:06:17

Chciałbym utworzyć konto gościa i zalogować osoby, które wprowadzają Kod Beta testera do tego konta. Coś w tym stylu:

def beta_code_accepted(request):
    guest_user = User.objects.get(username='beta_guest')
    login(request, guest_user)

Po zakończeniu beta, po prostu wyłączyć widok splash.

 0
Author: mif,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-15 15:14:08

HOW to re-use (tweak) internal Django login_required

Na przykład, musisz zezwolić na dostęp do strony tylko użytkownikom, którzy przekazali login_required i są również trenerami - i (zapisz) przekazują instancję coacha do twojego widoku do dalszego przetwarzania

Decorators.py

from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect

from profiles.models import CoachProfile


def coach_required(function):
    def wrapper(request, *args, **kwargs):
        decorated_view_func = login_required(request)
        if not decorated_view_func.user.is_authenticated():
            return decorated_view_func(request)  # return redirect to signin

        coach = CoachProfile.get_by_email(request.user.email)
        if not coach:  # if not coach redirect to home page
            return HttpResponseRedirect(reverse('home', args=(), kwargs={}))
        else:
            return function(request, *args, coach=coach, **kwargs)

    wrapper.__doc__ = function.__doc__
    wrapper.__name__ = function.__name__
    return wrapper

Views.py

@coach_required
def view_master_schedule(request, coach):
    """coach param is passed from decorator"""
    context = {'schedule': coach.schedule()}
    return render(request, 'template.html', context)
 0
Author: pymen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-01 12:22:49