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

Django: Тонкая настройка @login_required decorator

Я хочу начать частную бета-версию для моего сайта. У меня есть страница всплеска, где пользователь может ввести код для доступа к остальной части сайта. В настоящее время все остальные страницы сайта (за исключением страницы всплеска) состоят из серии перенаправлений, настроенных по требованию входа пользователя (через @login_required decorator).

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

Должен ли я изменить декоратор @login_required? Мне больше нравится просто делать следующее (я добавил переменную сеанса, если пользователь вводит правильный код на странице всплеска).

def view_name(request):
    user=request.user  
    if not user.id or not request.session.get('code_success'):
           return HttpResponseRedirect('/splash/')

Это кажется разумным? Мне бы очень хотелось повторить это для всех моих взглядов

Брендан

4b9b3361

Ответ 1

Напишите свой собственный декоратор - он довольно прямолинейный. На самом деле, если вы посмотрите на источник Django для login_required, вы сможете поиграть с копией в своих целях.

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

Ответ 2

Я бы рекомендовал вместо этого использовать промежуточное ПО. Это облегчит падение, как только вы покинете свою частную бета-версию. Есть несколько примеров входа в систему, требуемые посредниками на djangonsippets:

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

Я бы рекомендовал взять один из них и настроить его, чтобы включить в него логику бета-кода.

Ответ 3

Я бы создал гостевую учетную запись и запустил пользователей, которые вводят код бета-тестера в эту учетную запись. Что-то в этом роде:

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

Как только ваша бета-версия будет завершена, просто отключите всплеск.

Ответ 4

КАК повторно использовать (настроить) внутренний Django login_required

Например, вам нужно разрешить доступ к странице только для пользователей, которые передали login_required и также являются тренерами - и дальнейшая обработка

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)