如何在django的每个视图中运行一段代码?

时间:2010-02-19 12:09:47

标签: python django

如果授权失败,我需要在我的一个Django应用程序的每个视图中检查用户授权(我不使用Django的内置auth系统)并将用户重定向到“login please”页面。

代码如下所示:

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");

我找到的解决方案是:

  • 包含标记 - 没有, 因为我不能在任何地方重定向 从那里
  • 自定义功能 - 也不做,因为同样的 原因。

这项任务似乎微不足道,但我无法找到解决方案。我会非常感谢任何帮助。

4 个答案:

答案 0 :(得分:6)

查看source code for django.contrib.auth decorators。它们完全符合您的要求,但适用于内置的Django身份验证系统(see the documentation)。为您的身份验证系统做类似的事情应该不难。

顺便说一下,为什么不使用内置的身份验证?您可以将它与自定义身份验证后端一起使用...

答案 1 :(得分:2)

我找到了我想要的答案。函数装饰器允许在函数开头运行代码的和平。

您必须定义装饰器功能

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,谢谢你的帮助。

答案 2 :(得分:1)

想到函数装饰器

答案 3 :(得分:0)

在此处查看用户身份验证页面http://docs.djangoproject.com/en/dev/topics/auth/

继续阅读“login_required decorator”。

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
   ...

如果未通过设置“settings.LOGIN_URL”进行身份验证,您可以设置用户重定向的位置。

在页面上还有一个特殊身份验证模板示例,您可以根据自己的喜好设置样式!