基于用户的Django认证用户
我在做一个django项目时遇到了困难,我使用了django自带的登录系统,一切都运行得很好。我有三个用户,第一个用户可以看到“管理员面板”,第二个用户可以看到“信息捕获面板”,而第三个用户只能看到前两个用户打印的内容。
我有几个问题:
我需要怎么给每个用户设置权限?
我怎么才能把每个面板重定向到对应的用户?
附注:我已经为每个面板准备好了模板、网址和视图,但我不知道怎么显示它们。
非常感谢你们花时间回答这个新手的问题,我才刚开始接触这个框架一周。
更新
现在我遇到了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"),
)
这是我的views.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'
2 个回答
我需要给每个用户什么权限?
你需要为每种类型的用户创建一个组,比如“超级用户”、“普通用户”和“受限用户”。这些组可以在Django的管理控制台中创建,然后你可以通过同样的管理控制台把每个用户分配到相应的组里。
我怎么能把每个面板重定向到对应的用户?
你需要定义一个重定向视图,这个视图会根据用户所属的组,把用户的请求转发到相应的“面板”视图。
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提到的注解来限制访问特定的视图。我的例子是基于用户组的限制,而他的答案是基于用户权限的限制。选择哪种方式主要是个人偏好,尤其是在处理像你描述的简单权限方案时。
* 更多细节 *
要在用户登录时重定向他们...
在urls.py中为你的重定向视图创建一个命名的URL
url(r'^panel-redirect/$' , PanelRedirectView.as_view() , name="panel-redirect"),
在settings.py中更改LOGIN_REDIRECT_URL,使其指向这个重定向视图
LOGIN_REDIRECT_URL = reverse('panel-redirect')
当用户登录时,他们会被重定向到重定向视图,然后这个视图会根据他们所属的组把他们引导到正确的面板。
这句话的意思是,有些东西可能是在重复以前的工作,就像是“重新发明轮子”一样。
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(...)