Django:调整@login_required装饰器

|| 我想为我的网站开始一个私人Beta版。我有一个初始页面,用户可以在其中输入代码,然后访问网站的其余部分。当前,所有其他站点页面(启动页面除外)都包含一系列通过要求用户登录(通过@login_required装饰器)设置的重定向。 我希望登录用户和输入Beta Tester代码的人都能够访问网站的其余部分。这意味着我不能只将装饰器用于所有视图。 我应该更改@login_required装饰器本身吗?我更愿意执行以下操作(如果用户在初始页面上输入正确的代码,则添加了一个会话变量)。
def view_name(request):
    user=request.user  
    if not user.id or not request.session.get(\'code_success\'):
           return HttpResponseRedirect(\'/splash/\')
这看起来合理吗?我讨厌不得不重复我的所有观点 布伦丹     
已邀请:
编写自己的装饰器-相当简单。实际上,如果您查看source1 source的Django源码,则应该能够为自己的目的而摆弄一个副本。
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
    
我建议改用中间件。一旦退出私测版,这将使删除操作变得更加容易。在djangonsippets上有一些登录所需的中间件的示例: http://djangosnippets.org/snippets/1220/ http://djangosnippets.org/snippets/136/ 我建议您选择其中之一并进行调整,使其包含Beta代码逻辑。     
如何重用(调整)内部Django login_required 例如,您需要只允许通过了login_required检查并且也是Coachs的用户访问页面,并且(保存)pass coach实例到您的视图中以进行进一步处理   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)
    
我将创建一个访客帐户并登录输入Beta Tester代码到该帐户的人。遵循以下原则:
def beta_code_accepted(request):
    guest_user = User.objects.get(username=\'beta_guest\')
    login(request, guest_user)
测试版完成后,只需禁用启动画面即可。     

要回复问题请先登录注册