Python 如何在django中的每个视图中运行一段代码?
我需要在我的Django应用程序的每个视图中检查用户授权(我不使用Django的内置授权系统),如果授权失败,则将用户重定向到“请登录”页面 代码如下所示:Python 如何在django中的每个视图中运行一段代码?,python,django,Python,Django,我需要在我的Django应用程序的每个视图中检查用户授权(我不使用Django的内置授权系统),如果授权失败,则将用户重定向到“请登录”页面 代码如下所示: try: admin_from_session = request.session['admin']; admin = Administrator.objects.get(login = admin_from_session.login, password = admin_from_session.password, ena
try:
admin_from_session = request.session['admin'];
admin = Administrator.objects.get(login = admin_from_session.login, password = admin_from_session.password, enabled=True);
except KeyError, Administrator.DoesNotExist:
return HttpResponseRedirect('/controlpanel/login')
问题是:如何在每个视图的开头运行此代码,而不必每次重复?
如果我在PHP上编写程序,我会将此代码放在单独的文件中,并在需要授权的每个页面的开头编写类似的内容:
include("redirect_if_not_logged_in.inc.php");
我找到的解决办法是:
- 包含标签-不起作用, 因为我不能重定向到任何地方 从那里
- 自定义功能- 也不做,因为一样 原因
这项任务似乎微不足道,但我找不到解决办法。如果有任何帮助,我将不胜感激。我会想到函数装饰器。请查看。除了内置的Django身份验证系统(),它们完全可以执行您想要的操作。为您的身份验证系统做类似的事情应该不难
顺便说一句,为什么不使用内置的auth呢?您可以将其用于自定义身份验证后端…请查看此处的用户身份验证页面 请继续阅读“登录所需的装饰器” 如果未通过设置“settings.LOGIN\u URL”进行身份验证,则可以设置用户重定向的位置
在页面上还有一个特殊身份验证模板的示例,您可以根据自己的喜好设置样式 我找到了我想要的答案。函数修饰符允许在函数的开头运行一段代码 您必须定义一个decorator函数
def login_please_decorator(view_func):
"""
Redirect if admin was not logged in
"""
def _decorated(request, *args, **kwargs):
#Check authorization
try:
admin_from_session = request.session['admin'];
admin = Administrator.objects.get(login = admin_from_session.login, password = admin_from_session.password, enabled=True);
return view_func(request,*args, **kwargs);
except KeyError, Administrator.DoesNotExist:
return HttpResponseRedirect('/cp/login?ret=' + request.path);
return _decorated
并使用此函数名装饰视图:
@login_please_decorator
def some view(request):
# do something ...
# ...
Ludwik Trammer,bugspy.net,谢谢你的帮助。你是说别的吗?python中的函数注释是一个完全不相关的特性:感谢您的帮助。我不使用内置auth,因为我的需要很多自定义字段和功能,我真的不知道如何使内置auth按我的需要工作。也许我太习惯于自己重写所有的东西,而不是使用别人的代码。我猜这是一个坏习惯:)使用自定义身份验证后端,您可以使用任意数量的字段。您只需编写一个实现两个方法的类:1。authenticate()-给定的登录凭据(可以是任何凭据,不必只是登录名和密码),它会检查它们,并从数据库返回用户对象,或者相应地不返回。2.get_user()-给定的用户id返回用户对象。这就是全部。django.contrib.auth将很好地与django的其他部分(如管理)配合使用,更重要的是,django可重用应用程序(这是django最强大的功能之一)。编写自定义身份验证后端的文档:他没有使用内置的auth系统,因此,
@login\u required
在这里不起作用。在会话中存储密码可能不是一个好主意。了解如何使用内置的身份验证系统。对于用户的其他字段,请设置UserProfile模型。
@login_please_decorator
def some view(request):
# do something ...
# ...