Python 如何在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

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

代码如下所示:

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 ...
    # ...