看文档 djang 自带一个用户登录验证的方法,不过有些看着懵逼,去网上找了一圈,发现很多都是照抄文档说明的,几乎没说啥原理

特别是

from django.contrib.auth import authenticate

都说这个方法是,不过貌似文档中说的是使用django自带的模型可以对用户登录做一个验证,

但是业务需求不需要,不可能使用django的user模型

from django.contrib.auth.models import User 

# 这是django的验证模型,继承自 AbstractBaseUser, PermissionsMixin
# from django.contrib.auth.models import AbstractUser  这是自定义模型可以使用request.user 的继承类  注意  
 https://docs.djangoproject.com/zh-hans/2.2/topics/auth/customizing/ 

# 查看源码可知
class User(AbstractUser):
"""
Users within the Django authentication system are represented by this
model. Username and password are required. Other fields are optional.
"""
class Meta(AbstractUser.Meta):
swappable = 'AUTH_USER_MODEL' settings 中设置 AUTH_USER_MODEL 指向那个模型验证

通常都是自定义

所以自定义一个用户模型

class User(models.Model,AbstractBaseUser): # 想了想貌似需要继承AbstractBaseUser 当进行密码保存时也会进行一个加密 其中username和password 必须拥有
class Meta: 
  db_table = 'user' username = models.CharField(max_length=20,null=True,unique=True)
password = models.CharField(max_length=128)
create_date = models.DateTimeField(auto_now_add=True) # 注意 需要添加两个字段 不然进行服务器启动时会出现 AttributeError: type object 'User' has no attribute 'USERNAME_FIELD' 错误
# 如果继承了 AbstractBaseUser 则需要使用这两字段
identifier = models.CharField(max_length=40, unique=True)
USERNAME_FIELD = 'identifier'

ps:需要看这文章 https://www.cnblogs.com/zhanghongfeng/p/8331493.html

要有usernam和password两个属性

同时在sessting中指定用户登录验证模型是哪一个,不指定则会使用django默认的用户登录验证表去进行一个验证...  没有在这个模型存入,玩个锤子验证哦

AUTH_USER_MODEL = 'user.User'  # app名字.表名字

不过 貌似django也自带一个session会话保存数据库表... (分布式需要把?)

只要进行了登录验证 也会保存在django_session表中,貌似可以在settings中可以关掉,但是不会到过期时间自动清除(默认30天),而是一直保存在表中

from django.contrib.auth import authenticate,login
def login_auth(request): # 如果用户登录还想再次访问login,验证cookes中含有is_login字段则将返回index页面
if request.COOKIES.get('is_login'):
     # if request.user.request.user.is_authenticated:
      return redirect(reverse('user:index')) 

   if request.POST.method == 'POST': # 在前端页面自己写一个loginform登录框 
       username = request.POST.get('username')
       password= request.POST.get('password')
# 会往指定模型中寻找含有该字段的数据数据,如果存在该实例 继续往下
       user = authenticate(username=username,password=password) # 如果使用其他字段也行,比如你模型中用有email验证 那么改为 (email=email,...) 不强求
       if user:
         # from django.contrib.auth.decorators import login_required
         # 看源码可知 将查询到的用户实例的 pk (id) 加入session中 使用login_required 来判断是否为登录用户
       # 还可以使用 request.user.is_authenticated 查看登录用户其他属性
         login(request,user)
         
         # 防止登录用户进入 或者不设置 使用request.user.request.user.is_authenticated 确定是否为登录用户 上面确定cookies也注释掉
         request.COOKIES['is_login'] = True # 得到cookies之前进行跳转登录前的页面
         # 或者有些页面需要登录才能查看,那么在进行跳转时在url中加入 当前视图url request.path 得到当前视图url
         # https://docs.djangoproject.com/zh-hans/2.2/topics/auth/default/
         # return redirect('%s?next=%s' % (login, request.path)
              next = request.COOKIES.get('next')
  if next:
  return redirect(reverse(next)) return redirect(reverse('user:index')) return render(request,'user/login.html')

其中源码还对request.user 进行了一个属性设置 可以用request.user.is_authenticated 对其该用户验证为登录用户,html模板中也能使用???

是一个用户实例????

https://segmentfault.com/q/1010000004663650 看

指定的模型除了 验证还能得到该的属性???

退出使用logout

from django.contrib.auth import logout

def logout(request):
logout(request)
return redirect(reverse("user:index"))

对用户登录视图验证

from django.contrib.auth.decorators import login_required
@login_required
def xxx():
pass

如果不想这种办法也不想将session保存在数据库中,将login替换

可以将用户一些不太重要的数据以字符串字典

request.COOKES['user']="user_id:%s" user.id

保存在cookies中(用户名或者id主键), 使用可逆推加密算法进行一个加密

如果用户请求,进行一个解密,如果含有user字段,并该字段中含有user_id

user = request.COOKES.get('user')
if user:
# 进行你的解密得到记过 user的values值
  ... if 'user_id' in values:
# 确定是登陆用户 请继续往下操作 else:
....

引用

https://www.cnblogs.com/guoguojj/p/8607951.html

https://www.cnblogs.com/zhanghongfeng/p/8331493.html

django 从零开始 8 用户登录验证 待测的更多相关文章

  1. 如何使用Django实现用户登录验证

    最初开始搞用户登录验证的时候感觉没什么难的,不就是增删改查中的查询数据库么,但是还是遇到许多小问题,而且感觉在查询数据库的时候,要把前端的数据一条一条的进行比对,会导致我的代码很丑,而且方式很不智,所 ...

  2. djangorestframework-jwt自带的认证视图进行用户登录验证源代码学习

    Django REST framework JWT djangorestframework-jwt自带的认证视图进行用户登录验证源代码学习 SECRET_KEY = '1)q(f8jrz^edwtr2 ...

  3. cookie实现用户登录验证

    cookie实现用户登录验证 1, INSTALLED_APPS中注册app03 2,在主程序中新建映射关系到app3的url中 from django.conf.urls import url,in ...

  4. django rest_framework 实现用户登录认证

    django rest_framework 实现用户登录认证 1.安装 pip install djangorestframework 2.创建项目及应用 创建过程略 目录结构如图 3.设置setti ...

  5. android loginDemo +WebService用户登录验证

        android loginDemo +WebService用户登录验证 本文是基于android4.0下的loginActivity Demo和android下的Webservice实现的.l ...

  6. Python程序练习1-模拟用户登录验证

    1.功能简介 此程序模拟用户登录验证的过程,实现用户名输入.黑名单检测.用户有效性判别.密码输入及验证等.用户在3次以内输入正确密码登陆成功,连续输错3次密码登陆失败,且该用户名被记录在黑名单,黑名单 ...

  7. python3 用户登录验证的小功能

    用户登录验证,记录一下,还需要修改黑名单不合理 #!/usr/bin/env python3 ''' 需求:编写登录接口 1.输入用户名和密码 2.验证用户密码成功后输出欢迎消息 3.3次没有验证通过 ...

  8. Django实现单用户登录

    最近由于要毕业了写论文做毕设,然后还在实习发现已经好久都没有写博客了.今天由于工作需求,需要用Django实现单用户登录.大概意思就是跟QQ一样的效果,每个账号只能一个地方登录使用,限制账号的登录次数 ...

  9. 用javascript实现简单的用户登录验证

    用javascript实现简单的用户登录验证 <!DOCTYPE html> <html lang="en"> <head> <meta ...

随机推荐

  1. Java多线程基础详解

    基础概念进程进程是操作系统结构的基础:是一次程序的执行:是一个程序及其数据在处理机上顺序执行时所发生的活动.操作系统中,几乎所有运行中的任务对应一条进程(Process).一个程序进入内存运行,即变成 ...

  2. Java虚拟机内存划分

    Java虚拟机在执行Java程序时,会把它管理的内存划分为若干个不同的数据区.这些区域有不同的特性,起不同的作用.它们有各自的创建时间,销毁时间.有的区域随着进程的启动而创建,随着进程结束而销毁,有的 ...

  3. svn使用3 (转)

    接下来,试试用TortoiseSVN修改文件,添加文件,删除文件,以及如何解决冲突等. 添加文件 在检出的工作副本中添加一个Readme.txt文本文件,这时候这个文本文件会显示为没有版本控制的状态, ...

  4. Linux下Centos 7如何关闭防火墙?

    Linux下的防火墙有两种:Iptables和Firewall(概念以及区别大家可以自行搜索).为什么要关闭防火墙呢?主要是我们都过Linux搭建服务器的时候其他机器访问会被墙掉,例如:Tomcat, ...

  5. VisionPro连接Dalsa线扫相机

    1 环境配置 硬件:编码器(提供编码信号的PLC) 线扫相机 镜头 相机线缆 图像采集卡(Dalsa_Xcelera-CL_PX4 Dual) 软件:VisionPro 8.2 VisionPro软件 ...

  6. 一个类似ThinkPHP的Node.js框架——QuickNode

    QuickNode Node.js从QuickNode开始,让restful接口开发更简单! PHP的MVC 作为一名曾经的PHP开发者,我也有过三年多的thinkphp使用经验,那是我学习PHP接触 ...

  7. Android的HttpClient调用,冲突的解决办法

    只适用部分情况 题外话 攻关百度自动发贴作推广失败,但登录已拿下.全扔有点浪费. 在登录的基础上写了个百度的自动签到系统,功能已实现([java,android,nodejs,.net]+nodejs ...

  8. 格式化MyEclipse代码(java、jsp、js)行的长度@修改java代码字体@修改Properties文件编码方式

    每次用MyEclipse/Eclipse自带的快捷键Ctrl+shift+f格式化代码时,如果原来的一行代码大于80列,Eclipse就会自动换为多行.如果想格式化代码后不想让代码换行可以通过以下方式 ...

  9. JXJJOI2018_T1_market

    题目描述 某天Lemon去超市买柠檬,他发现货架上有N个柠檬,每个柠檬都有一个重量Wi和价格Ci. Lemon身上只带了S元钱,因此他想要买一个价格不超过S的柠檬回家,另外,他希望他买的那个柠檬的性价 ...

  10. Python---5Python内置的有序集合-list和tuple

    list Python内置的一种数据类型是列表:list,[ ].可以修改的集合. list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: ...