我想为我的网站开始私有测试版。我有一个启动页面,用户可以输入代码然后访问网站的其余部分。目前,所有其他网站页面(除了启动页面)都包含一系列通过要求用户登录设置的重定向(通过@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/')
这看起来合情合理吗?我不想在我的所有观点中重复它
布伦丹
答案 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)
完成测试后,只需停用启动视图即可。