用户认证

主要分两部分:

  1.auth模块  

    from django.contrib import auth

  2.User对象

    from django.contrib.auth.models import User

用户认证组件key:

1.大前提:针对的是django自带的auth_user表

2.django下的auth_user 表创建用户

3.request.user

  用户(user_obj)登录成功后:

    auth.login(request,user_obj)做了以下几件事:

      (1)过程赋值 request.user=user_obj

      (2)request.session["user_id"]=user_obj.pk ,将此项信息注入到session表中,session_data 加了一个键值对user_id=user_obj.pk

      做了3件事:

        1.创建一把session 钥匙 session_key = 随机字符串

        2.把这条记录放进seesion表中

        3.返回钥匙给浏览器

4.每次请求request都是重新构建的,但AuthenticationMiddleware 这个中间件,在每次客户端发请求过来时做了一下几件事:

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

(1)读session_key 钥匙,在到session表中,找 session_id对应的值 ,找到对应的id后再去auth_user表中获取该用户对象,并做赋值操作:request.user=找到的用户对象

(2)没有找到就用匿名用户对象  :  request.user=匿名用户对象

auth模块

  from django.contrib import  auth

  from django.contrib.auth import authenticate, login ,logout

  1.authenticate()

    user_obj=authenticate(username=someone_username,password=someone_password)

    1.验证用户名或密码是否正确

    2.正确就返回用户对象,不正确则返回none

  2.login(request,user_obj)

    登录成功后:

      login(request,user_obj)  

      再重定向到指定页面

  3.logout

    def logout_view(request):

      logout(request)

      再重定向到登录页面

    logout(request) 大致做了以下几件事:

      1. request.session.flush()

      2.request.user=AnonymouseUser() #赋值给匿名用户对象

    

 User 对象

User对象属性: username,password (必填),密码是加密的。

1、user对象的 is_authenticated()

1.request.user.is_authenticated()判断用户是否已经登录,如果true则可以向前台展示request.user.name

要求:

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

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

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

#方法一  (非装饰器)

def my_view(request):
if not request.user.is_authenticated():
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path)) #方式二(装饰器)
from django.contrib.auth.decorators import login_required @login_required
def my_view(request):

@login_request装饰器的详解

auth_user对象(request.user)的API:

    request.user.id 判断是否登录过
request.user.is_authenticated() #判断是否登录过

装饰器:@login_required 有从哪来回哪去功能

django.contrib.auth.decorators import login_required
如:
1.没有登录就访问books页面,@login_required会给用户重定向到登录页面
2.同时,跳转到登录页面默认地址 127.0.01:8000/account/login/?next=/books/ ;
因为global_settings 中默认:"/account/login/"
from django.conf import global_settings
LOGIN_URL="/account/login/"
,可以在项目的配置文件settings中修改该参数值:
LOGIN_URL="/login/" @login_request装饰器实现从哪来到哪去的功能细节:
            地址栏数据部分:?next=/books/ 在后端可以通过 nex_path =request.GET.get("next") or "/books/"获取到,登录成功后直接重定向到该地址nex_path
   nex_path =request.GET.get("next") or "/books/" 说明: 1.如果用户是直接选择login页面直接登录访问时,request.GET.get("next")的返回值就为None,
所以这时redirect(None),会报错,所以这种情况让它重定向到books页面就好。
2.如果用户不是直接选择login页面,而是直接访问其他需要先登录后才能访问的页面,就回到登录页面,登录成功后,重从定向的页面路径获取:
nex_path =request.GET.get("next")

所以在登录视图函数中(非装饰器login视图函数,模拟装饰器@login_required实现登录成功后,跳转到之前的访问页面):
def login(request):
if request.method=="GET":
return render(request,"login.html")
else:
user_obj=auth.authenticate(username=user,password=pwd) #查询是否有该对象,有就返回or返回none
if user_obj:
#登录成功
auth.login(request,user_obj)
#print(request.path)
#print(request.get_full_path())
                      #注意如果前端用的是ajax提交请求时,注意ajax中的url,需要时空,默认提交到本页面,不要指定login页面,否则获取不到
                      next_path 的路径
next_path=request.GET.get("next") or "/books/" #next_path 表示之前的访问页面地址,如何是直接访问login页面则重定向到books页面
                      return redirect(next_path) else:
return redirect("/login/")

对@login_request 装饰器的使用需要注意点:

 到项目的settings配置文件中添加一个键值对:LOGIN_URL="/login/" ,  否则默认为:LOGIN_URL="/account/login/"

2.创建用户

auth_user表中创建用户:

    #auth_user 表: 
  from django.contrib.auth.models import User
User.objects.create(username="egon",password="") #这种方式创建的用户密码也是明文的
User.objects.create_user(username="alex",password="")#密文
User.objects.create_superuser(username="taibai",password="",email="122323223@qq.com")#密文,创建superuser时,需要email

3.核对密码:check_password(passwd)

用户需要修改密码的时候 首先要让他输入原来的密码 ,如果给定的字符串通过了密码检查,返回 True

4.修改密码 :set_password()

user = User.objects.get(username='')
user.set_password(password='')
user.save 

示例:

1.注册:

def sign_up(request):

    state = None
if request.method == 'POST': password = request.POST.get('password', '')
repeat_password = request.POST.get('repeat_password', '')
email=request.POST.get('email', '')
username = request.POST.get('username', '')
if User.objects.filter(username=username):
state = 'user_exist'
else:
new_user = User.objects.create_user(username=username, password=password,email=email)
new_user.save() return redirect('/book/')
content = {
'state': state,
'user': None,
}
return render(request, 'sign_up.html', content)  

2.修改密码:

@login_required
def set_password(request):
user = request.user
state = None
if request.method == 'POST':
old_password = request.POST.get('old_password', '')
new_password = request.POST.get('new_password', '')
repeat_password = request.POST.get('repeat_password', '')
if user.check_password(old_password):
if not new_password:
state = 'empty'
elif new_password != repeat_password:
state = 'repeat_error'
else:
user.set_password(new_password)
user.save()
return redirect("/login/")
else:
state = 'password_error'
content = {
'user': user,
'state': state,
}
return render(request, 'set_password.html', content)

Django用户认证组件的更多相关文章

  1. web框架开发-Django用户认证组件

    可以用认证组件做什么 针对session的缺陷, 跟新数据时,不跟新key键, 用户认证组件是删除后再重建 用户认证组件很多功能可以直接使用 利用用户认证表(auth_user,通过Django自己创 ...

  2. 10.Django用户认证组件

    用户认证组件: 功能:用session记录登录验证状态: 前提:用户表,django自带的auth_user 创建超级用户:python manage.py createsuperuser       ...

  3. django——用户认证组件

    用户认证 auth模块 1 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1.1 .authenti ...

  4. Django之路——11 Django用户认证组件 auth

    用户认证 auth模块 1 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1.1 .authenti ...

  5. django - 总结 - 用户认证组件

    用户认证组件 from django.contrib import auth 从auth_user表中获取对象,没有返回None,其中密码为密文,使用了加密算法 user = auth.authent ...

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

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

  7. django的用户认证组件

    DataSource:https://www.cnblogs.com/yuanchenqi/articles/9064397.html 代码总结: 用户认证组件: 功能:用session记录登录验证状 ...

  8. 06 django的用户认证组件

    1.用户认证组件 用户认证组件: 功能:用session记录登录验证状态 前提:用户表:django自带的auth_user 创建超级用户: python3 manage.py createsuper ...

  9. Django组件 - cookie、session、用户认证组件

    一.cookie 1.会话跟踪技术 1)什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话 ...

随机推荐

  1. Android Studio 快捷键、Debug的使用

    https://blog.csdn.net/q908555281/article/details/49331371 1.快捷键      个人习惯常用快捷键      在Eclipse中常用的快捷键 ...

  2. [LightOJ 1341] Aladdin and the Flying Carpet (算数基本定理(唯一分解定理))

    题目链接: https://vjudge.net/problem/LightOJ-1341 题目描述: 问有几种边长为整数的矩形面积等于a,且矩形的短边不小于b 算数基本定理的知识点:https:// ...

  3. JZ2440之GPIO篇

    买来开发板已经有一段时间了,刚接触时兴奋至极,后来跟着视频看下去发现似乎自己并没有学到太多东西,于是发现自己可能欠缺的太多以致从课程中无法提取出重要的东西来,所以并没有得到太多的营养成分.因此我个人认 ...

  4. 【ASP.Net】publish asp.net to local IIS

    做web项目难免要将项目部署, 要么部署在azure上,要么部署在本地, 使用IIS去host. 部署步骤很简单, 1. vs打开你的web项目, 项目名上面右键选择publish 2. 在弹出的pu ...

  5. 【.Net】在windows server 2016 和Windows10这些server上安装.net fw3.5

    一般就是打开server manager. 一直next到add feature 讲net3.5勾选 发现需要指定一个路径是什么 source\sxs之类的 下载microsoft-windows-n ...

  6. CAS Client集群环境的Session问题及解决方案介绍,下篇介绍作者本人项目中的解决方案代码

    CAS Client集群环境的Session问题及解决方案  程序猿讲故事  2016-05-20  原文 [原创申明:文章为原创,欢迎非盈利性转载,但转载必须注明来源] 之前写过一篇文章,介绍单点登 ...

  7. [转载]error while loading shared libraries的解決方法

    转自:https://blog.csdn.net/dumeifang/article/details/2963223 error while loading shared libraries的解決方法 ...

  8. js操作css变量

    原文:http://css-live.ru/articles/dostup-k-css-peremennym-i-ix-izmenenie-spomoshhyu-javascript.html :ro ...

  9. 4、My Scripts

    脚本目录列表 1.在windows编写的shell脚本利用dos2unix命令格式化一下(P308) 2.bash命令参数调试(P309) 3.使用set命令调试部分脚本内容(P312) 4.开发脚本 ...

  10. 1、Python模块和包(0602)

    模块.异常.运行环境.mysqldb 模块: 顶层文件:作为整个文件的程序入口,就是负责去调用其他文件中的代码来实现程序流程功能的,称为顶层程序文件, 模块文件1 模块文件2 python模块 1.可 ...