(转)Django ====> 实战学习篇十四 处理登录和注销;控制权限
原文地址:http://blog.csdn.net/thinkinside/article/details/7247171
源代码下载地址:留言写下邮箱地址,一天内会发送给你全部源代码
处理登录和注销:
- 之前实现了用户管理,本节对用户登录和登出进行处理,引入了admin所以处理变得很简单;
- 在Html文件或者view函数中判断用户是否已经登录以及获取用户信息:
if request.user.is_authenticated(): #判断用户是否已登录 user = request.user; #获取已登录的用户 else: user = request.user; #非登录用户将返回AnonymousUser对象 在base.html中加入代码,见下边:
- Django的User对象提供了一系列的属性和方法,其实哦哪个password存储的是加密后的密码,is_staff记录用户是否有管理员权限等;同时django.contrib.auth模块中提供了authenticate(),login(),logout()等函数,进行认证,登录登出等功能。
- Django提供了一写列内置的处理login logout的view函数,但是因为提供的功能和这里不一样,所以还是需要自己实现view函数。
- 希望只有登录后的用户才可以管理产品,所以在右上角输入用户名和密码并登录后,该处显示用户名和”注销“按钮,而页面重定向的产品管理的界面。
- 而注销后再恢复成登录表单。
- 明确需求之后,开始配置url,login和logout属于整个project,所以在depot/urls.py中加入:
from depotapp.views import login_view,logout_view urlpatterns = patterns('', ... ... (r'^accounts/login/$', login_view), (r'^accounts/logout/$', logout_view), )
- 因为没有专用的独立的登录界面,所以view函数是在depotapp的views.py中实现:
from django.contrib.auth import authenticate,login,logout def login_view(request): user = authenticate(username=request.POST['username'], password=request.POST['password']) if user is not None: login(request, user) print request.user return list_product(request) else: #暂时不做处理 return store_view(request) def logout_view(request): logout(request) return store_view(request)
- 所有界面都 在base.html中,将base.html的topbar原来登录表的部分,改成如下样子:
{% if request.user.is_authenticated %} <div class="pull-right"> <a href=#>欢迎您:{{request.user}}</a> <a class="btn danger small" href="{% url depotapp.views.logout_view %}">注销</a> </div> {% else %} <form action="{% url depotapp.views.login_view %}" method='post' class="pull-right"> {% csrf_token %} <input name='username' class="input-small" type="text" placeholder="用户名"> <input name='password' class="input-small" type="password" placeholder="密码"> <button class="btn" type="submit">登录</button> </form> {% endif %}
- 大功告成,可以进行手动验证了。
权限控制:
- 大门上了锁,窗户不关也没有用啊,所以,要进行访问控制
- 这里实现的其实是最简单的控制,非登录用户禁止访问产品管理界面,在django中只需要在view函数中增加@login_required修饰符即可:
from django.contrib.auth.decorators import login_required ... ... @login_required def list_product(request): list_items = Product.objects.all() ... ...
- 修饰符实现了如下功能:
- 如果用户没有登录,重定向到/account/login/,并且把当前绝对url作为next参数用get方法传递过去;
- 如果已经正常登录,则直接正常执行视图函数;
- 这样例子中需要的功能就实现了。但是这充其量是“登录限制”,而更常见的需求是“访问控制”,即区分已经登录的用户,对不同的视图有不同的访问权限。因为我们的例子中没有涉及到,所以只把相关的做法简单例举在下面:
- 访问控制通过django的request.user.has_perm()实现,函数返回true和false。表示该用户是否有权限,而权限是auth应用中定义的Permission类型;User与Permission是many-to-many的关系
- django还提供了一个@permission_required修饰符,来限定view函数只有在User具有相应权限的情况下才能访问
- django对于每个模型类,自动增加add,change,delete三种权限,以便于控制权限,也可以自己设定自己的权限
- 这部分代码可以自己实现?????
“某度”空间 http://hi.baidu.com/new/wenjiashe521
cnblogs空间 http://www.cnblogs.com/wenjiashe521/