Django组件 用户认证,form
auth模块
在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中;
如果用户存在于数据库中,然后再验证用户输入的密码,这样一来就要自己编写大量的代码。
事实上,Django已经提供了内置的用户认证功能。
在使用"python manage.py makemigrationss"和"python manage.py migrate"迁移完成数据库之后
根据配置文件settings.py中的数据库段生成的数据表中已经包含了6张进行认证的数据表,分别是
- auth_user
- auth_group
- auth_group_permissions
- auth_permission
- auth_user_groups
- auth_user_user_permissions
进行用户认证的数据表为auth_user
要使用Django自带的认证功能,首先要导入auth模块 from django.contrib import auth
django.contrib.auth中提供了许多方法,这里主要介绍其中的三个:
一、(1)authenticate()
提供了用户认证,即验证用户名以及密码是否正确,一般需要username password两个关键字参数
如果认证信息有效,会返回一个 User 对象。authenticate()会在User 对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的。当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象会报错的!!
user = authenticate(username='someone',password='somepassword')
使用Pycharm新建项目authDemo
执行2个命令,生成django需要的表
- python manage.py makemigrations
- python manage.py migrate
我们只需要用到auth_user表,就可以了!
打开auth_user表,默认是空的。其中2个字段,username和password是必须要有的!
注意:添加用户,不能直接插入记录,必须使用命令行
创建超级用户
python manage.py createsuperuser
查看auth_user表,发现多了一条记录
注意:密码是加密的,不能直接查表验证。必须使用authenticate() 进行验证!
- from django.shortcuts import render,HttpResponse,redirect
- from django.contrib import auth
- # Create your views here.
- def login(request):
- if request.method == "POST":
- user = request.POST.get("user")
- pwd = request.POST.get("pwd")
- #用户验证成功,返回user对象,否则返回None
- ret = auth.authenticate(username=user,password=pwd)
- print(ret)
- print(ret.__dict__)
- if ret:
- return redirect("/index/")
- return render(request,"login.html")
- def index(request):
- return render(request, "index.html")
视图函数
(2)login(HttpRequest, user)
该函数接受一个HttpRequest对象,以及一个认证了的User对象
此函数使用django的session框架给某个已认证的用户附加上session id等信息。
- from django.shortcuts import render,HttpResponse,redirect
- from django.contrib import auth
- # Create your views here.
- def login(request):
- if request.method == "POST":
- user = request.POST.get("user")
- pwd = request.POST.get("pwd")
- #用户验证成功,返回user对象,否则返回None
- user = auth.authenticate(username=user,password=pwd)
- # print(user)
- # print(user.__dict__)
- if user:
- #登录,注册session
- # 全局变量 request.user=当前登陆对象(session中)
- auth.login(request,user)
- return redirect("/index/")
- return render(request,"login.html")
视图函数
request.user 默认是一个匿名对象,auth_user表的所有字段对应的值,都是空的。
当登录成功之后,该对象才会有值。
request.user是全局变量,可以在任意代码中运用
它用了一个中间件,在settings.py中的MIDDLEWARE配置项里
- 'django.contrib.auth.middleware.AuthenticationMiddleware',
(3)logout(request) 注销用户
首页添加注销功能
该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。
- def logout(request): # 注销
- auth.logout(request) # 清除session和cookie
- return redirect("/login/")
它其实和session清理类似,也是执行了命令
- request.session.flush()
但是在清理之前,它做了一些条件判断!
注销之后,request.user就是匿名用户了!
注意:user是下面这行代码。变量的名字而已(等式左边的名字)
- user = auth.authenticate(username=user,password=pwd)
request.user不是固定写法,根据变量名而变化!
二、User对象
User对象的属性
User对象属性:username, password(必填项)password用哈希算法保存到数据库
is_staff : 用户是否拥有网站的管理权限.
is_active : 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录。
(1)user对象的 is_authenticated()
如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。
通过认证并不意味着用户拥有任何权限,甚至也不检查该用户是否处于激活状态,这只是表明用户成功的通过了认证。
这个方法很重要,
在后台用request.user.is_authenticated()判断用户是否已经登录,如果true则可以向前台展示request.user.name
- def index(request):
- print(request.user) # 默认是一个匿名对象
- print(request.user.id)
- print(request.user.username)
- if not request.user.is_authenticated:
- return redirect("/login/")
- name = request.user.username
- return render(request, "index.html",{"name":name})
index 函数
注意:is_authenticated后面是没有括号的,它返回一个布尔值!
(2) 创建用户
auth 提供的一个创建新用户的方法,需要提供必要参数(username、password)等。
- from django.contrib.auth.models import User
- user = User.objects.create_user(username='用户名',password='密码',email='邮箱',...)
auth 提供的一个创建新的超级用户的方法,需要提供必要参数(username、password)等。
- from django.contrib.auth.models import User
- user = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)
Django组件 用户认证,form的更多相关文章
- 061.Python前端Django组件用户认证组件
一 auth认证组件 在使用pymysql,数据库迁移的时候.,默认生成有十张表如下 查看author_user表结构 mysql> desc auth_user; +------------- ...
- Django组件-用户认证
用户认证 一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1.1 .authenti ...
- Django 组件-用户认证
用户认证 auth模块 from django.contrib import auth 1.1 .authenticate() 提供了用户认证,即验证用户名以及密码是否正确,一般需要username ...
- Django组件:用户认证组件
一丶用户认证 1.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: (1).authent ...
- Django组件——用户认证
用户认证 一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1 .authentica ...
- python 全栈开发,Day79(Django的用户认证组件,分页器)
一.Django的用户认证组件 用户认证 auth模块 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中: 如果用户存在于数据库中,然后再验证用户 ...
- 06 django的用户认证组件
1.用户认证组件 用户认证组件: 功能:用session记录登录验证状态 前提:用户表:django自带的auth_user 创建超级用户: python3 manage.py createsuper ...
- Django--分页器(paginator)、Django的用户认证、Django的FORM表单
分页器(paginator) >>> from django.core.paginator import Paginator >>> objects = ['joh ...
- COOKIE与SESSION、Django的用户认证、From表单
一.COOKIE 与 SESSION 1.简介 1.cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. ...
随机推荐
- plsql programming 13 其他数据类型
bolean 类型 raw 类型, 用来保存和操作少量的二进制数据. urowid 和 rowid 类型, 这两种数据类型表示数据库的 rowid. 所谓 rowid 就是一个标识符-用来表示数据库中 ...
- 解决easyui tabs中href无法跨域跳转
<!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" content ...
- 集合映射Set(使用xml文件)
如果持久类具有Set对象,可以在映射文件中使用set元素映射Set集合. set元素不需要索引元素. List和Set之间的区别是: Set只存储唯一的值. 我们来看看我们如何在映射文件中实现集合: ...
- org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [cn.facekee.cms.entity.CmsFansgroup#195]
刚开始报错还是报的稀奇古怪的错误,让我纠结了好久,再三检查报错的位置,发现并没有错误,最后认真分析查看每行报错的信息才找到如题所述的错误!!!!! 报这种错误的原因可能是POJO映射文件中的字段和数据 ...
- 哈工大LTP
http://ltp.ai/ http://pyltp.readthedocs.io/zh_CN/latest/ http://www.cnblogs.com/Denise-hzf/p/6612886 ...
- POJ3259(虫洞)
题目大意:给你一张图,先输入m条双向边(权值为正),再输入w条单向边(权值为负),判断是否有负环 题目思路:bellman-ford或者SPFA都行,我用的是SPFA(因为和POJ1860类似,就不加 ...
- Sublime Text 3如何快速生成HTML5的头部信息和常用的快捷键
一.快速生成HTML5的头部信息的步骤: 1.Ctrl + N,新建一个文档: 2.Ctrl + Shift + P,打开命令模式,再输入 sshtml 进行模糊匹配,将语法切换到html模式: 3. ...
- Nginx 解决WebSocket TCP 转发问题
背景: IM 即时通讯时候 , 前期我用的是IP 没什么问题,当然上线肯定要搞个域名搞搞了! 那么问题来了------>Nginx 我按照原先那样配置时候不行了, 连接不了. 解决方法: ...
- 密钥管理服务KMS
密钥管理服务 KMS - 腾讯云 https://cloud.tencent.com/product/kms
- cron_action
crontab using shell script to automate linux system maintenance tasks Linux中用crontab例行工作安排_Linux教程 ...