Django: Tweaking @login_required decorator
Write your own decorator - it's fairly straight forward. In fact, if you look at the Django source for login_required
, you should be able to fiddle around with a copy for your own purposes.
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
I would recommend using a middleware instead. That will make it easier to drop once you move out of your private beta. There are a couple examples of login required middlewares on djangonsippets:
http://djangosnippets.org/snippets/1220/
http://djangosnippets.org/snippets/136/
I would recommend taking one of those and tweaking it to include you beta code logic.
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_requiredfrom django.core.urlresolvers import reversefrom django.http import HttpResponseRedirectfrom profiles.models import CoachProfiledef 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_requireddef view_master_schedule(request, coach): """coach param is passed from decorator""" context = {'schedule': coach.schedule()} return render(request, 'template.html', context)