07+. Django用户登录验证系统和登录注销

简介: 打开微信扫一扫,关注微信公众号【数据与算法联盟】 转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 Github:https://github.com/thinkgamer写在前边的话一直以来对Django的用户权限登录保护模棱两可,最近由于在做一个django的项目,其中涉及到用户的权限登录保护,所以算是有些清楚了,总结下来,给还在模棱两可的你阅读。

码农故事多微信公众号二维码
打开微信扫一扫,关注微信公众号【数据与算法联盟】

转载请注明出处: http://blog.csdn.net/gamer_gyt
博主微博: http://weibo.com/234654758
Github: https://github.com/thinkgamer


写在前边的话

一直以来对Django的用户权限登录保护模棱两可,最近由于在做一个django的项目,其中涉及到用户的权限登录保护,所以算是有些清楚了,总结下来,给还在模棱两可的你阅读。
附上我最近一直在commit的github地址:https://github.com/Thinkgamer/CSMarket


环境说明

Django:1.10
Python:3.5


用户登录验证

1:前提说明

    以下所谈到的用户登录验证给予扩展Django 内置的User模型,以AbstractUser方式扩展User模型,Django中的用户扩展的两种方式可参考:http://blog.csdn.net/gamer_gyt/article/details/50499653
     以下代码为上边给的github地址中的实例,抽取其中用户验证为例。

2:以AbstractUser方式扩展内置User

models.py:

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.

class User(AbstractUser):
    # 手机号
    user_phone = models.CharField(blank=True, verbose_name='电话', max_length=11)
    #判断是否是认证通过的用户
    user_isValid=models.BooleanField(blank=True,default=False)

    def __unicode__(self):
        return self.user.username

admin.py:

from django.contrib import admin
from logre.models import User
admin.site.register(User)

3:authenticate 进行用户验证

    提供了用户认证,即验证用户名以及密码是否正确。一般需要username password两个关键字参数。
    如果认证信息有效,会返回一个 User 对象。authenticate()会在User 对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的。当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象会报错的!!

user = authentica(username=’someone’,password=’somepassword’)

那么用户登录函数该怎么写呢?
views.py

#用户登录
@csrf_exempt
def login(request):
    if request.method=='POST':
        uname=request.POST.get('username')
        pwd=request.POST.get('passwd')
        user = authenticate(username=uname,password=pwd)
        if user is not None:
            auth_login(request, user)
            # 更新最后登录时间
            now_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
            user.last_login=now_time
            user.save()
            return HttpResponseRedirect(referer)
        else:
            return render_to_response('login.html',{
                'error': '邮箱或者密码不正确',
                'user_name': uname,
                'user_pwd': pwd,
            })
    else:
            return render_to_response('login.html',{})

注意事项:这里的authentica函数只能接受username和password,因为我在测试email的时候不好使(如果恰巧你看到了这里,并且验证可以用email和password验证的话,请留言)

AbstractUser扩展的User模型,在数据库中密码存储形式是经过转化的,所以我们并不能直接操作密码,幸好django提供了专门的函数来修改密码。

set_password 函数

eg:(由于我项目还没更新到这一步,所以这里就举这样一个简单的例子)

>>> from django.contrib.auth.models import User 
>>> u = User.objects.get(username='john')
>>> u.set_password('new password') 
>>> u.save()

4:Permission

Django的auth系统提供了模型级的权限控制, 即可以检查用户是否对某个数据表拥有增(add), 改(change), 删(delete)权限。

auth系统无法提供对象级的权限控制, 即检查用户是否对数据表中某条记录拥有增改删的权限。如果需要对象级权限控制可以使用django-guardian。

假设在博客系统中有一张article数据表管理博文, auth可以检查某个用户是否拥有对所有博文的管理权限, 但无法检查用户对某一篇博文是否拥有管理权限

user.has_perm方法用于检查用户是否拥有操作某个模型的权限

eg:

user.has_perm('blog.add_article')
user.has_perm('blog.change_article')
user.has_perm('blog.delete_article')

如果要添加权限的话,我们可以在后台管理中自己添加,当然也可以使用以下方法添加

user.user_permissions.add()

删除权限:

user.user_permissions.delete()

清空权限

user.user_permissions.clear()

用户拥有他所在用户组的权限, 使用用户组管理权限是一个更方便的方法。Group中包含多对多字段permissions, 在数据库中由auth_group_permissions数据表维护。

添加权限

group.permissions.add(permission)

删除权限

group.permissions.delete(permission)

清空权限

group.permissions.clear()

当然我们也可以自定义权限,可参考之前文章中的内容:http://blog.csdn.net/gamer_gyt/article/details/51023560


用户登录和注销

1:Http请求和回应

参考:http://djangobook.py3k.cn/appendixH/‘>HTTP请求(Request)和回应(Response)对象

2:用户登录

该函数接受一个HttpRequest对象,以及一个认证了的User对象
此函数使用django的session框架给某个已认证的用户附加上session id等信息。

其实在我们上边的views.py函数中也有看到就是 auth_login(request,user)
前提条件是扩展django的User用户模型,使用时需要导入django的login

from django.contrib.auth import login as auth_login

PS:我这里as为auth_login是因为我的views函数为login,否则会重名,会出现错误
使用:

 uname=request.POST.get('username')
 pwd=request.POST.get('passwd')
 user = authenticate(username=uname,password=pwd)
 if user is not None:
    auth_login(request, user)

3:用户注销

logout:该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错

from django.contrib.auth import logout as auth_logout
def logout(request):
    auth_logout(request)
    return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))

4:登录之后保持会话状态

在其登录之后会将用户信息保存在request中,那么我们我进行一个views 函数前,可以先判断下request.user是否存在,如存在将数据传递给返回前端,如果不存在我们也可以添加一些其他的逻辑。

def all(request):
    if request.user.is_authenticated:
        user_name=request.user
    else:
        user_name=''
    return render(request, 'news.html', {
        'user_name': user_name,
    })

5:如何记录登录前的来源页面

这里我们使用的是:

request.META[‘HTTP_REFERER’]

大概实现的思路是:在login函数内声明一个全局变量referer,在不是发生post请求的时候记录下来源页面赋值给referer,在是发生post请求后返回到原页面。代码如下:

#用户登录
@csrf_exempt
def login(request):
    global referer
    if request.method=='POST':
        ...
        return HttpResponseRedirect(referer)
    else:
        try:
            referer = request.META['HTTP_REFERER']  # 获取网页访问来源
        except:
            pass
        finally:
            return render_to_response('login.html',{})

总结

    其实Django本身的用户验证系统和登录注销功能是十分强大的,在开发过程中如果能利用好这些技术点,必然会节约很多我们的开发时间。

    附本人的Django专栏:Django从零开始到项目优化

相关文章
|
14天前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
65 21
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
13天前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
43 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
9天前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
22 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
25天前
|
前端开发 搜索推荐 算法
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
中草药管理与推荐系统。本系统使用Python作为主要开发语言,前端使用HTML,CSS,BootStrap等技术和框架搭建前端界面,后端使用Django框架处理应用请求,使用Ajax等技术实现前后端的数据通信。实现了一个综合性的中草药管理与推荐平台。具体功能如下: - 系统分为普通用户和管理员两个角色 - 普通用户可以登录,注册、查看物品信息、收藏物品、发布评论、编辑个人信息、柱状图饼状图可视化物品信息、并依据用户注册时选择的标签进行推荐 和 根据用户对物品的评分 使用协同过滤推荐算法进行推荐 - 管理员可以在后台对用户和物品信息进行管理编辑
57 12
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
|
9天前
|
机器学习/深度学习 人工智能 算法
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台。果蔬识别系统,本系统使用Python作为主要开发语言,通过收集了12种常见的水果和蔬菜('土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜'),然后基于TensorFlow库搭建CNN卷积神经网络算法模型,然后对数据集进行训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地文件方便后期调用。再使用Django框架搭建Web网页平台操作界面,实现用户上传一张果蔬图片识别其名称。
29 0
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
2月前
|
自然语言处理 前端开发 数据处理
Django的模板系统
【8月更文挑战第13天】
25 2
|
2月前
|
API Java 数据库连接
从平凡到卓越:Hibernate Criteria API 让你的数据库查询瞬间高大上,彻底告别复杂SQL!
【8月更文挑战第31天】构建复杂查询是数据库应用开发中的常见需求。Hibernate 的 Criteria API 以其强大和灵活的特点,允许开发者以面向对象的方式构建查询逻辑,同时具备 SQL 的表达力。本文将介绍 Criteria API 的基本用法并通过示例展示其实际应用。此 API 通过 API 构建查询条件而非直接编写查询语句,提高了代码的可读性和安全性。无论是简单的条件过滤还是复杂的分页和连接查询,Criteria API 均能胜任,有助于提升开发效率和应用的健壮性。
62 0
|
2月前
|
前端开发 数据处理 开发者
解锁Django模板系统终极奥义!揭秘高效前端渲染秘籍,让你的网站秒变炫酷黑科技!
【8月更文挑战第31天】Django作为Python的高级Web框架,内置的模板系统支持动态HTML渲染。本文通过在线书店案例,详细介绍Django模板系统的设置与高效渲染技巧,包括创建模板文件、编写视图函数及URL配置。通过合理使用过滤器、深度查询和模板继承等技巧,提升前端渲染效率和安全性,优化Web应用开发流程。
14 0
|
2月前
|
数据库 数据安全/隐私保护 Python
django 快速实现完整登录系统
django 快速实现完整登录系统
|
2月前
|
存储 API 数据库
Django后端架构开发:构建在线云媒资系统思路解析
Django后端架构开发:构建在线云媒资系统思路解析
38 0