如何解决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,**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,**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,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)
测试版完成后,只需禁用启动画面即可。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。