10.Django用户认证组件
用户认证组件:
功能:用session记录登录验证状态;
前提:用户表,django自带的auth_user
创建超级用户:python manage.py createsuperuser kris的密码是abc123456
1.基于用户认证组件的登录验证信息储存
views.py
from django.shortcuts import render, HttpResponse, redirect # Create your views here.
from django.contrib import auth
#from django.contrib.auth.models import User #自己找到那个接口做校验 auth_user那个表 def login(request): if request.method =="POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd")
#if 验证成功返回user对象,否则返回None
user = auth.authenticate(username=user,password=pwd)
if user: #用它封装好的做校验
auth.login(request,user) #auth.login这个方法需要传两个参数; request.user = user 就是当前登录对象;如果没有登录它拿到的是一个匿名对象
return redirect("/index/") return render(request, "login.html") def index(request):
print("request.user:", request.user) #没有登录就会打印一个匿名对象 request.user: AnonymousUser
print("request.user:", request.user.username) #request.user:
print("request.user:", request.user.id) #request.user: None
print("request.user:", request.user.is_anonymous) #request.user: True
#拿上边这几个值都可以判断用户是否登录。
if request.user.is_anonymous:
#if not request.user.user.is_authenticated: #它跟上边的是一样的
return redirect("/login/")
#username = request.user.username
#return render(request, "index.html",{"username":username}) 可以不这样写,当然这是一种传变量的方式。request.user是个全局变量,一直都是代表当前登录对象
return render(request, "index.html")


login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
用户名<input type="text" name="user">
密码<input type="text" name="pwd">
<input type="submit" value="submit">
</form>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{#<h3> Hello {{ username }}</h3> 可以不给它传值了,request.user为全局#}
<h3>Hello {{ request.user.username }}</h3>
</body>
</html>
创建用户kris 和 alex
C:\Users\Administrator\PycharmProjects\authDemo>python manage.py createsuperuser
Username (leave blank to use 'administrator'): alex
Email address:
Password:alex1234
Password (again):alex1234
Superuser created successfully.

更新的时候它不像之前那样子,它把session_key 和session_data数据都更新了,之前都是只更新session_data,现在逻辑跟严谨了。
2.注册/注销用户功能
views.py
def logout(request):
auth.logout(request)
return redirect("/login/") def reg(request):
if request.method=="POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd")
user = User.objects.create_user(username=user,password=pwd) #做注册,插入这张表中,一定要按照摘要算法插入,把password进行转换成密文
return redirect("/login/")
return render(request,"reg.html")
reg.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>注册</h3>
<form action="" method="post">
{% csrf_token %}
用户名<input type="text" name="user">
密码<input type="text" name="pwd">
<input type="submit" value="submit">
</form>
</body>
</html>
index.html
<body>
<a href="/logout/">注销</a>
</body>
一点击注销按钮,就把django_session里边的记录都给清除了。
用户认证组件: 功能:用session记录登录验证状态; 前提:用户表,django自带的auth_user 创建超级用户:python manage.py createsuperuser kris的密码是abc123456 API
from django.contrib import auth auth对象下面的方法
1 if 验证成功返回user对象,否则返回None
user = auth.authenticate(username=user,password=pwd) 2 auth.login(request,user) #request.user:当前登录对象 3 auth.logout(request)
from django.contrib.auth.models import User #User==auth_user user对象下面的方法
4 request.user.is_authenticated: 5 user=User.objects.create_user(username='',password='',email='') 补充:
匿名用户对象
匿名用户
class models.AnonymousUser django.contrib.auth.models.AnonymousUser 类实现了django.contrib.auth.models.User 接口,但具有下面几个不同点: id 永远为None。
username 永远为空字符串。
get_username() 永远返回空字符串。
is_staff 和 is_superuser 永远为False。
is_active 永远为 False。
groups 和 user_permissions 永远为空。
is_anonymous() 返回True 而不是False。
is_authenticated() 返回False 而不是True。
set_password()、check_password()、save() 和delete() 引发 NotImplementedError。
New in Django 1.8:
新增 AnonymousUser.get_username() 以更好地模拟 django.contrib.auth.models.User。 总结: if not:auth.login(request,user) request.user == AnonymousUser()#没有登录
else:request.user==登录对象
request.user是一个全局变量
在任何视图和模板中直接使用
3.基于用户认证组件的认证装饰器
如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。
通过认证并不意味着用户拥有任何权限,甚至也不检查该用户是否处于激活状态,这只是表明用户成功的通过了认证。 这个方法很重要, 在后台用request.user.is_authenticated()判断用户是否已经登录,如果true则可以向前台展示request.user.name
要求:
1 用户登陆后才能访问某些页面,
2 如果用户没有登录就访问该页面的话直接跳到登录页面
3 用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址
方法一
def order(request):
if not request.user.is_outhenticated:
return redirect("/login/")
return render(request,"order.html")
方法二
django已经为我们设计好了一个用于此种情况的装饰器:login_requierd()
先在settings里边设置下我要跳转到哪个页面
STATIC_URL = '/static/' LOGIN_URL = "/login/" #跳转到哪里由我自己决定; 不加这个django会给你默认跳转到 127.0.0.1:8000/accounts/login/?next=/index/;设置好这个后跳转到:/login/?next=/index/(是访问index进行跳转的)
在views里边
from django.shortcuts import render, HttpResponse, redirect # Create your views here.
from django.contrib import auth
from django.contrib.auth.models import User #自己找到那个接口做校验 from django.contrib.auth.decorators import login_required #引入 def login(request): if request.method =="POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd")
#if 验证成功返回user对象,否则返回None
user = auth.authenticate(username=user,password=pwd)
if user:
auth.login(request,user) #request.user:当前登录对象 next_url = request.GET.get("next","/index/") #如果找不到就跳转到index页面
# return redirect("/index/") #不要写死了就跳转到index
return redirect(next_url) #动态的根据参数来配 return render(request, "login.html") @login_required #有了装饰器,就不需要自己写下面的了
def index(request):
# print("request.user:", request.user.username)
# print("request.user:", request.user.id)
# print("request.user:", request.user.is_anonymous)
#
# if request.user.is_anonymous: #把这些自己写的认证全关了,@login_required是django给我们封装好了的
# #if not request.user.is_authenticated: #这两个是一样的
# return redirect("/login/")
# #username = request.user.username
# #return render(request, "index.html",{"username":username}) return render(request, "index.html") def logout(request):
auth.logout(request)
return redirect("/login/") def reg(request):
if request.method=="POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd")
user = User.objects.create_user(username=user,password=pwd)
return redirect("/login/")
return render(request,"reg.html") @login_required
def order(request):
# if not request.user.is_outhenticated:
# return redirect("/login/") #可以加装饰器,不用自己这样写了
return render(request,"order.html")
若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' (这个值可以在settings文件中通过LOGIN_URL进行修改)。并传递 当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。

10.Django用户认证组件的更多相关文章
- web框架开发-Django用户认证组件
可以用认证组件做什么 针对session的缺陷, 跟新数据时,不跟新key键, 用户认证组件是删除后再重建 用户认证组件很多功能可以直接使用 利用用户认证表(auth_user,通过Django自己创 ...
- Django用户认证组件
用户认证 主要分两部分: 1.auth模块 from django.contrib import auth 2.User对象 from django.contrib.auth.models imp ...
- django——用户认证组件
用户认证 auth模块 1 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1.1 .authenti ...
- Django之路——11 Django用户认证组件 auth
用户认证 auth模块 1 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1.1 .authenti ...
- python 全栈开发,Day79(Django的用户认证组件,分页器)
一.Django的用户认证组件 用户认证 auth模块 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中: 如果用户存在于数据库中,然后再验证用户 ...
- Django的用户认证组件,自定义分页
一.用户认证组件 1.auth模块 from django.conrtrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1)authen ...
- django - 总结 - 用户认证组件
用户认证组件 from django.contrib import auth 从auth_user表中获取对象,没有返回None,其中密码为密文,使用了加密算法 user = auth.authent ...
- django的用户认证组件
DataSource:https://www.cnblogs.com/yuanchenqi/articles/9064397.html 代码总结: 用户认证组件: 功能:用session记录登录验证状 ...
- 06 django的用户认证组件
1.用户认证组件 用户认证组件: 功能:用session记录登录验证状态 前提:用户表:django自带的auth_user 创建超级用户: python3 manage.py createsuper ...
随机推荐
- 算法排序【时间复杂度O(n^2)】
排序算法的两个原则: 1.输出结果为递增或者递减. 2.输出结果为原输入结果的排列或者重组. 平均时间复杂度为O(n^2)的排序算法有三种: 冒泡排序,插入排序,选择排序. 一.冒泡排序: 即谁冒泡泡 ...
- linux4.10.8 内核移植(二)---初步裁剪、分区修改和文件系统
一.初步裁剪 在内核根目录下 执行: make menuconfig 1.1 system type裁剪 选择 SAMSUNG S3C24XX SoCs Support 进入其中,这里是配置我们的单板 ...
- 20155117王震宇 2016-2017-2 《Java程序设计》第六周学习总结
教材学习内容总结 IO流的分类: 根据流的数据对象来分: 高端流:所有的内存中的流都是高端流,比如:InputStreamReader 低端流:所有的外界设备中的流都是低端流,比如InputStrea ...
- 有关Linux的.a、.so和.o文件(转)【原文章有些错误,自己已更改】
gcc 生成 .a静态库和 .so动态库 我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库两种.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库 ...
- django(二)中间件与面向切面编程
一.中间件概念 django 自带函数可以在几个环节调节收到请求.处理请求.处理异常.以及发送请求. 看这里给的链接好了,这是一个大佬的讲django中间件的博客,非常清楚:https://www.c ...
- MYSQL和oracle 大小写问题
MySQL的大小写问题 不是一个很大的问题,但是如果不了解的话,却会使用户产生迷惑 :如下面 Sql代码insert into t values('A'); insert into t values( ...
- media属性
media=“screen”是什么意思?? media 属性规定目标 URL 是为什么类型的媒介/设备进行优化的. 该属性用于规定目标 URL 是为特殊设备(比如 iPhone).语音或打印媒介设计的 ...
- mysql服务里面没有启动项
解决:5.0版本:开始->运行->cmd,进到mysql安装的bin目录D:\MySQL\bin>mysqld.exe -installService successfully in ...
- js的正则表达式编程,悬赏解决下面的问题
悬赏解决下面的问题 1.切分url 2.将时间日期 转化为 yyyy-MM-dd的模式和可逆性 3.数据的千分位和可逆性 4.用C#或者nodejs检索如下的模式 h1{ border:1px sol ...
- UML和模式应用4:初始阶段(3)--需求制品之用例模型
1. 前言 UP开发包括四个阶段:初始阶段.细化阶段.构建阶段.移交阶段: UP每个阶段包括 业务建模.需求.设计等科目: 其中需求科目对应的需求制品包括:设想.业务规则.用例模型.补充性规格说明.词 ...