(转)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三种权限,以便于控制权限,也可以自己设定自己的权限
  • 这部分代码可以自己实现?????
posted @ 2012-11-27 16:26  事件轮询,回不到过去  阅读(903)  评论(0编辑  收藏  举报