前言

做web应用对登录做用户身份认证,然后设置session是必不可少的,因为我们就需要把有权限访问本站视图的用户,单独建一张表记录到数据库里;

Django作为一个大而全的框架,已经为我们做好了这些准备;

from django.shortcuts import render,HttpResponse,redirect

def login(request):
if request.method=='GET':
return render(request,'login.html')
user=request.POST.get('user')
pwd=request.POST.get('pwd')
print(user,pwd)
if user=='张根' and pwd=='123.com': #1、用户认证
request.session['name']=user #2、属于本站用户设置session,识别用户身份
request.session['status'] = True
return redirect('/index')
else:
error='用户名/密码错误'
return render(request,'login.html',locals()) def index(request): #3、其他视图,做用户身份检查
status=request.session.get('status')
if status:
return HttpResponse('index')
else:
return redirect('/login/')

一、认证登录

from django.contrib import auth  导入Django自带的认证模块

python manage.py createsuperuser 创建一个超级用户,本文不涉及用户权限管理;

用户创建完成之后密码加密成密文显示,呵呵 人性化吧?

1  authenticate(username=username,password=password)   

检查用户是存在在auth_user表及用户名和密码是否正确?

如果认证 成功 会返回一个 user对象,否则返回None。

2、login(HttpRequest, user) 

该函数接受一个HttpRequest对象,以及一个认证了的User对象,给用户设置cookie+session

def log_in(request):
if request.method=='GET':
nextpath=request.GET.get('next','/index/')
return render(request,'login1.html',locals()) else:
username=request.POST.get('username')
password=request.POST.get('password')
#密码zhanggen123.com
valid_code=request.POST.get('valid_code')
#设置统一报错信息
ajax_response = {"user": None, "errors": ""}
#如果验证和 session中设置的验证码一致,
if valid_code.upper()==request.session.get('valid_code').upper():
# 进行用户验证
user=authenticate(username=username,password=password)
if user:
login(request,user)
ajax_response['user']=user.username
else:
ajax_response['errors'] ='用户名/密码错误'
else:
ajax_response['errors'] = '验证码错误'
return HttpResponse(json.dumps(ajax_response))

3、  logout(request) 注销用户 

用户注销:删除当前登录用户的session信息

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

def log_out(request):
logout(request)
return redirect('/index/')

4、user对象的 is_authenticated()  和@login_required

检查当前用户是否验证过?返回布尔值 true和flase

要求:

1  用户登陆后才能访问某些页面,

2  如果用户没有登录就访问该页面的话直接跳到登录页面

3  用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址

方法1:

def my_view(request):
if not request.user.is_authenticated():
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

方法2:

from django.contrib.auth.decorators import login_required

@login_required   就不用在一个个视图函数中做is_authenticated()验证了。
def my_view(request):
...

若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ '

(这个值可以在settings文件中通过LOGIN_URL进行修改)。并传递  当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。

LOGIN_URL = '/login/ '

二、用户操作相关User 对象方法  

2.1  is_authenticated()

如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。
通过认证并不意味着用户拥有任何权限,甚至也不检查该用户是否处于激活状态,这只是表明用户成功的通过了认证。 这个方法很重要, 在后台用request.user.is_authenticated()判断用户是否已经登录,如果true则可以向前台展示request.user.name

2.2  创建用户

使用 create_user 辅助函数创建用户:

models.UserInfo.objects.create_user(username=username,password=password,email=email,avatar=avatar)

#注意create_user中的_

2.3  修改用户密码

set_password(passwd)

def set_password(request):
if request.method=='GET':
return render(request,'set_password.html')
else:
oldpwd=request.POST.get('oldpwd')
newpwd = request.POST.get('newpwd')
user=request.user
if user.check_password(oldpwd):
user.set_password(newpwd)
user.save()
return redirect('/login/')

2.4  check_password(passwd)

检测用户的密码是否正确?如果给定的字符串通过了密码检查,返回 True
 

2.5 修改密码实例

使用 set_password() 来修改密码

def set_password(request):
if request.method=='GET':
return render(request,'set_password.html')
else:
oldpwd=request.POST.get('oldpwd')
newpwd = request.POST.get('newpwd')
user=request.user
if user.check_password(oldpwd):
user.set_password(newpwd)
user.save()
return redirect('/login/')

参考链接:http://www.cnblogs.com/yuanchenqi/articles/7439088.html#3770465  二龙湖浩哥

 

Django之用户认证功能的更多相关文章

  1. Django之用户认证组件

    auth模块 之前我们在进行用户登录验证的时候,都是自己写代码,接收用户提交的数据,然后去数据库取数据进行匹配验证,其实Django已经给我们提供了内置的用户认证功能.不信的话你可以打开models. ...

  2. python 全栈开发,Day79(Django的用户认证组件,分页器)

    一.Django的用户认证组件 用户认证 auth模块 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中: 如果用户存在于数据库中,然后再验证用户 ...

  3. Django之用户认证auth模块

    一 Django中的auth模块: 我们在使用模块之前要先导入模块: from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介 ...

  4. Django组件 用户认证,form

    auth模块 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中: 如果用户存在于数据库中,然后再验证用户输入的密码,这样一来就要自己编写大量的代码 ...

  5. Django学习笔记(13)——Django的用户认证(Auth)组件,视图层和QuerySet API

    用户认证组件的学习 用户认证是通过取表单数据根数据库对应表存储的值做比对,比对成功就返回一个页面,不成功就重定向到登录页面.我们自己写的话当然也是可以的,只不过多写了几个视图,冗余代码多,当然我们也可 ...

  6. Django之用户认证—auth模块

    用户认知———auth模块 目录: auth模块 User对象 实例 扩展默认的auth_user表 - 创建超级用户 - python3 manager.py createsuperuser - 认 ...

  7. Django自定义用户认证系统之自定义用户模型

    参考文档:http://python.usyiyi.cn/django/topics/auth/customizing.html Django 自带的认证系统足够应付大多数情况,但你或许不打算使用现成 ...

  8. 深入一下Django的用户认证和cache

    深入一下Django的用户认证和cache 用户认证 首先明白一个概念,http协议是无状态的,也就是每一次交互都是独立的,那如何让服务器和客户端进行有状态的交互呢,现在较为常见的方法就是让客户端在发 ...

  9. COOKIE与SESSION、Django的用户认证、From表单

    一.COOKIE 与 SESSION 1.简介 1.cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. ...

随机推荐

  1. CSS基本内容

    CSS样式表的三种引入方式: 1.外部样式表——即将CSS样式写在单独的一个.css文件中: <link rel="stylesheet" type="text/c ...

  2. border:none和border:0的区别

    C:当定义border:none时,表示无边框样式,浏览器并不会对边框进行渲染,也就没有实际的宽度:  D:定义边框时,除了设置宽度外,还必须设置边框的样式才能显示出来.     border:0;浏 ...

  3. Node前后端分离基本概括

    首先从一个重要的概念“模板”说起. 广义上来说,web中的模板就是填充数据后可以生成文件的页面. 严格意义上来说,应该是模板引擎利用特定格式的文件和所提供的数据编译生成页面.模板大致分为前端模板(如e ...

  4. Vue运行报错--eslint

    Errors:? 1? http://eslint.org/docs/rules/no-trailing-spacesYou may use special comments to disable s ...

  5. Java生成指定长度的随机数

    char[] str = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', ' ...

  6. MVC数据列表展示【三】

    一.控制器向视图传递参数的两种形式:使用到的技术有EF,linq表达式,StringBuilder,相关技术都可以在我的博客园中找到详细的技术介绍. 1. 第一种是通过字符通过foreach循环拼接将 ...

  7. input 输入值的监听 禁止输入特殊字符

    1.input  输入值的监听 //用于监听input的值变化(input的值产生变化才会触发事件) (function ($) { $.fn.watch = function (callback) ...

  8. 虹软人脸识别SDK(java+linux/window)

    虹软官网:http://www.arcsoft.com.cn/ 登录后要实名认证才可以使用sdk. 下图这两个是我选择的,window版本地开发测试,linux版是生产环境使用. 1. 保存激活码,下 ...

  9. cocos2dx lua 绑定之一:自动绑定自定义类中的函数

    cococs2dx 3.13.1 + vs2013 + win10 1.首先定义C++类Student 在cocos2d-x\cocos文件夹下新建一个user_define的文件夹放置两个文件. 注 ...

  10. 第 8 章 容器网络 - 053 - overlay 是如何隔离的?

    overlay 是如何隔离的? 不同的 overlay 网络是相互隔离的. 创建第二个 overlay 网络 ov_net2 并运行容器 bbox3. docker network create -d ...