Django:调整@login_required装饰器

时间:2011-04-15 14:56:51

标签: python django decorator

我想为我的网站开始私有测试版。我有一个启动页面,用户可以输入代码然后访问网站的其余部分。目前,所有其他网站页面(除了启动页面)都包含一系列通过要求用户登录设置的重定向(通过@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/')

这看起来合情合理吗?我不想在我的所有观点中重复它

布伦丹

4 个答案:

答案 0 :(得分:24)

写你自己的装饰 - 这是相当直接的。事实上,如果你看一下login_required的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

答案 1 :(得分:4)

我建议使用中间件。一旦您离开私人测试版,这将使您更容易放弃。 djangonsippets上有几个需要登录的中间件的例子:

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

我建议您选择其中之一并进行调整,以包含您的测试代码逻辑。

答案 2 :(得分:1)

HOW to re-use (tweak) internal Django login_required

For example, you need to allow access to page for only users who passed login_required checks and also are Coaches - and (save) pass coach instance to you view for further processing

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)

答案 3 :(得分:0)

我会创建一个访客帐户并登录将该Beta帐户代码输入该帐户的人员。这些方面的东西:

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

完成测试后,只需停用启动视图即可。