在djang中检查每个请求的授权

2024-10-01 07:10:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django应用程序设置如下:

MyApp
    CustomAdmin
        urls
        models
        views
    MainApp
        settings
        urls
        wsgi
    SomeOtherApp
        admin
        models
        views

现在,在我的MainApp.urls中,我设置了以下url:

^{pr2}$

CustomAdmin中,我希望有一个单独的机制来检查请求是否由superuser发出,而不管关联的视图是什么。如果请求是由超级用户发出的,则该请求应该由相关联的view函数处理,否则将抛出403或类似错误。在

我在Laravel中使用了类似的东西,如下所示

Route::group(
    array(
        'before' => 'auth.admin',
        'prefix' => 'api/admin'        
        ),
    function(){
        ....
    });

我不确定Django是否存在这样的机制。如果有,我该怎么办?在


Tags: django应用程序urlwsgisettingsadminmodelsurls
3条回答

Fromccbv.co.uk和FromDjango Class-bases views docsdispatch()是类基视图中调用的第一个方法。在

查看类工作流

  1. 调度()
  2. http方法不允许()
  3. 选项()

请记住,所有泛型视图都继承视图类

中间件是一个很好的解决方案,但是如果您不需要预处理每个请求,您可以使用访问mixin。在

正如我前面所说,dispatch()是第一个执行的方法,因此您可以重写它来授予或拒绝对视图的访问。在

以下是dispatch默认代码:

def dispatch(self, request, *args, **kwargs):
    # Try to dispatch to the right method; if a method doesn't exist,
    # defer to the error handler. Also defer to the error handler if the
    # request method isn't on the approved list.
    if request.method.lower() in self.http_method_names:
        handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
    else:
        handler = self.http_method_not_allowed
    return handler(request, *args, **kwargs)

您可以编写mixin类:

^{pr2}$

然后可以在视图中使用它。让我们假设一个ListView

from django.views.generic import ListView
from somewhere import SuperuserRequiredMixin

class MyView(ListView, SuperuserRequiredMixin):
    ...
    # Do what you usually do...

我希望你觉得这个有用。在

我认为不可能在包含其他模式的url模式上定义它(稍后将对此进行更多测试),但至少可以在CustomAdmin.urls中使用^{}修饰符。在

# CustomAdmin/urls.py
from django.contrib.auth.decorators import user_passes_test
from CustomAdmin import views

requires_superuser = user_passes_test(lambda x: x.is_superuser)

urlpatterns = patterns(
    '',
    url(  # with a class based view
        r'^$', 
        requires_superuser(views.SomeView.as_view()), 
        name='someview'
    ),
    url(  # with a functional view
        r'^(?P<foo>\w+)/$', 
        requires_superuser(views.someotherview),    
        name='someotherview'
    ),
)

您可以编写一个middleware,允许您在视图中处理请求之前对其进行一些处理。在一个名为middleware.py的文件中,输入:

from django.contrib.auth.views import redirect_to_login

class AllowSuperUserOnly(object):
    def process_request(self, request):
        if request.path.startswith('/api/admin/'):
            if not request.user.is_superuser:
                return redirect_to_login(request.path)
        # Continue processing the request as usual:
        return None

并将中间件添加到您的settings.py。它应该与此类似:

^{pr2}$

相关问题 更多 >