Django: @login_required

发布时间 2023-03-31 23:09:43作者: Python喵

Django: Tweaking @login_required decorator

我想为我的网站开始一个私人Beta版。 我有一个初始页面,用户可以在其中输入代码,然后访问网站的其余部分。 当前,所有其他站点页面(初始页面除外)都包含一系列通过要求用户登录(通过@login_required装饰器)设置的重定向。

我希望登录用户和输入Beta Tester代码的人都能够访问网站的其余部分。 这意味着我不能只将装饰器用于所有视图。

我应该更改@login_required装饰器本身吗? 我更愿意执行以下操作(如果用户在启动页面上输入正确的代码,则添加了一个会话变量)。

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

这看起来合理吗? 我讨厌不得不重复我的所有观点

布伦丹


编写自己的装饰器-相当简单。实际上,如果您查看login_required的Django源代码,则应该能够为自己的目的而摆弄一个副本。

1
2
3
4
5
6
7
8
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检查并且也是Coaches的用户访问页面,并且(保存)pass coach实例到您查看以进行进一步处理

decorators.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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

1
2
3
4
5
@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代码到该帐户的人。遵循以下原则:

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

测试版完成后,只需禁用启动视图。