【问题标题】:Authentication User Django Depending on the User身份验证用户 Django 取决于用户
【发布时间】:2014-04-06 09:28:48
【问题描述】:

我被困在我的 django 项目上,我使用 django 默认登录系统,这里一切正常,我有 3 个用户,第一个获得“管理面板”,第二个获得“捕获信息面板”和第三个只能看到其他两个用户打印的内容。

我的问题是:

我需要为每个用户授予什么权限? 如何将每个面板重定向到各自的用户?

附:我已经有了每个面板的模板以及它们的 url 和视图,但我不知道如何显示它们。

提前感谢您抽出宝贵时间回答这个新手问题,但我一周前才开始使用这个框架。


更新

现在我收到 404 错误,而不是我应该重定向的页面。

这是我的 urls.py

from django.conf.urls import patterns, include, url
from .views import PanelRedirectView,PanelCapturista

urlpatterns = patterns('',

url(r'^$' , 'django.contrib.auth.views.login', {'template_name':'inicio/index.html'},
    name='login'),

url(r'cerrar/$' , 'django.contrib.auth.views.logout_then_login', name='logout'),

url(r'^panel-capturista/$' , PanelCapturista.as_view() , name="panel-capturista"),

)

我的观点.py

from django.core.urlresolvers import reverse_lazy
from django.views.generic.base import RedirectView,TemplateView


class PanelRedirectView(RedirectView):

    def get_redirect_url(self, *args, **kwargs):
        user = self.request.user
        if user.groups.filter(name='gerente').count():
            return reverse_lazy('panel-gerente')
        elif user.groups.filter(name='capturista').count():
            return reverse_lazy('panel-capturista')
    else:
        return reverse_lazy('cliente')

class PanelCapturista(TemplateView):
    template_name = 'capturista/panel-capturista.html'

【问题讨论】:

    标签: python django login


    【解决方案1】:

    类似的东西(也许是重新发明轮子)

    class require_permission:
         def __init__(self,permission,redirect="index/denied_access"):
           self.perm = permission
           self.redirect = redirect
    
        @require_login
        def __call__(self,f):
            def fn(self,request,*args,**kwargs):
               if not request.user.has_perm(self.perm):
                   redirect(self.redirect)
               return f(request,*args,**kwargs)
            return fn
    
     ...
    
     @require_permission(PERMISSION.CAN_VIEW_ADMIN,'index/capture_info')
     def admin_view(request,*args,**kw):
         return HttpResponse(...)
    
     @require_permission(PERMISSION.CAN_CAPTURE_INFO,'index/basic_user')
     def capture_view(request,*args,**kw):
          return HttpRespone(...)
    
     @require_login
     def basic_view(request,*args,**kw):
          return HttpResponse(...)
    

    【讨论】:

      【解决方案2】:

      我需要为每个用户授予什么权限?

      您需要在这里为每种类型的用户创建一个组 (https://docs.djangoproject.com/en/dev/topics/auth/default/#groups)。例如。 “超级用户”、“普通用户”和“受限用户”。这些组可以在 Django 管理控制台中创建,然后可以使用相同的 Django 管理控制台 (https://docs.djangoproject.com/en/dev/topics/auth/default/#managing-users-in-the-admin) 将每个用户分配到各自的组。

      如何将每个面板重定向到各自的用户?

      您需要定义一个 RedirectView,根据用户分配的组 (https://docs.djangoproject.com/en/dev/ref/class-based-views/base/#redirectview) 将用户的请求转发到预期的“面板”视图。

      from django.core.urlresolvers import reverse
      from django.views.generic.base import RedirectView
      
      from articles.models import Article
      
      class PanelRedirectView(RedirectView):
      
          def get_redirect_url(self, *args, **kwargs):
              user = self.request.user
              if user.groups.filter(name='superuser').count():
                  return reverse('superuser-panel')
              elif user.groups.filter(name='regular_user').count():
                  return reverse('regular-user-panel')
              else:
                  return reverse('restricted-user-panel')
      

      然后,您可以使用 Joran 描述的注释来限制对被重定向到的特定视图的访问。我描述的示例使用基于用户组的限制,而他的答案使用基于用户权限的限制。在处理像您所描述的那样的简单权限方案时,这更多是个人偏好。

      * 更多详情 *

      在登录时重定向用户...

      1. 在 urls.py 中为你的重定向视图创建一个命名的 url

        url(r'^panel-redirect/$' , PanelRedirectView.as_view() , name="panel-redirect"),

      2. 更改 settings.py 中的 LOGIN_REDIRECT_URL 以在登录时指向此重定向视图

        LOGIN_REDIRECT_URL = reverse('面板重定向')

      当该人登录时,他们将被重定向到 RedirectView,而 RedirectView 又会根据他/她分配的组将该人重定向到正确的面板

      【讨论】:

      • 感谢您帮助我了解这些信息 Jeff,这个类和函数是在 .models.py 还是 views.py 上定义的?抱歉,我对 MTV 还是有点困惑,谢谢。
      • 没问题! RedirectView 是 Django 所称的基于类的通用视图,您将把它放在您的 views.py 中。这些类本质上封装了常见的视图用例,并抽象出许多在基于函数的视图中发现的常见样板代码。然后,您可以通过继承覆盖类行为,如上所示。继续观看此视频 (youtube.com/watch?v=TZQ5eFVQmu0)。 Russell Keith-Magee 对社区选择这种基于类的视图路线的原因进行了非常详细的解释。另请查看此参考资料ccbv.co.uk
      • 谢谢你,杰夫,我阅读了你提供的全部信息,我真的能理解更多,但现在我遇到了一个不同的问题,我更新了我的问题,再次感谢。
      • 您调用什么 url 路径来获取 404?您应该像使用 panel-capturista 一样为每个特定面板定义一个 url。然后,您将需要调用 PanelRedirectView 的 url 定义,以便重定向到用户组指定的面板。
      • 当我在登录面板上输入我的超级用户时,我得到这个: 找不到页面 (404) 请求方法:GET 请求 URL:127.0.0.1:8000/accounts/profile 使用 transcabrera.urls 中定义的 URLconf,Django 尝试了这些URL 模式,按以下顺序:^admin/ ^ ^$ [name='login'] ^ cerar/$ [name='logout'] ^ ^accounts/panel-capturista/$ [name='panel-capturista'] ^ capturista/ 当前的 URL,accounts/profile/,与这些都不匹配 // 我不明白有什么问题:/
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 2013-05-03
      • 2013-01-08
      • 2010-12-23
      • 2019-03-30
      • 1970-01-01
      相关资源
      最近更新 更多