Auth的使用、缓存
auth 是什么,有什么作用
auth就是django 的一个app,做用户管理
Auth模块是Django自带的用户认证模块:
我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统–auth,它默认使用 auth_user 表来存储用户数据
默认的用户表示auth_user
创建一个用户:可以用代码,可以用命令
模块常用方法
1 authenticate()
提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。
如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。
authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。
user = authenticate(username='usernamer',password='password')
2 login(HttpRequest, user)
登录认证通过,调用一下这个方法,以后从request.user中才能取出当前登录用户
3 退出,一定要调用logout(request)
4 is_authenticated()
判断当前用户是否登录--不能使用request.user 是否有值来判断,因为他一直有值
request.user.is_authenticated()
配置文件中配置:---》表会被迁移
INSTALLED_APPS = [
'django.contrib.auth',
]
auth有哪些表---权限控制:
-Permission:auth_permission
-Group:auth_group
-User:auth_user --->密码加密--》
-auth_group_permissions
-auth_user_groups
-auth_user_user_permissions
如果用户没登录
request.user取出的是匿名用户:AnonymousUser类的对象---》也有pk,name,is_authenticated
使用
-1 user = authenticate(username='usernamer',password='password')
-2 login:用户校验通过,让它登录,执行它
-当前登录用户写入到session中
-后续 request.user 就能拿到当前登录用户
-3 logout:退出---》清空session
-4 request.user.is_authenticated 返回True或False
-5 login_requierd :登录认证装饰器---》放在视图函数上
@login_required(login_url='/login/')
-6 create_user:普通用户
-User.objects.create()--密码是加密的---》这样存密码是明文的
-7 create_superuser:超级用户 python38 manage.py createsuperuser
-8 check_password :通过明文密码校验密码是否正确
-9 set_password:修改密码
user.set_password(new_password)
user.save()
-10 User对象的属性
username
password
is_staff : 用户是否拥有网站的管理权限,能不能登录admin后台管理
is_active: 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录
is_active是False----authenticate也查不出来
is_superuser:是否是超级管理员,admin中权限最高
校验用户:必须传username和password
user = authenticate(username='usernamer',password='password')
from django.contrib.auth.models import User
user=User.objects.filter(username=username).first()
if user and user.check_password(password):
print('用户名密码正确')
else:
print('用户名密码错误')
uth模块的密码加密--同样的密码--》再次加密--》密文也不一样
怎么实现
pbkdf2_sha256$ # 加密方式
260000$ #过期时间
H93ubuUFw6FbYc6B8ojzKA$ # 随机串,,秘钥
H0ZnaiJOm/pI4K802Y2TcO5SQ7iWDcx5E+mb/hdABd8= #明文加密后的
后期如果你自己写了User表,但是想用人家的密码加密,就可以使用
-res=make_password('123456')
-check_password(明文,密文)
扩写auth的user表
第一种方案:通过一对一扩展
from django.contrib.auth.models import User
class UserDetail(models.Model):
user=models.OneToOneField(to=User)
phone=models.CharField(max_length=32)
第二种:通过继承 AbstractUser表来扩写
-1 在models.py中写 用户表
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
# 原来有的字段就不需要写了,只需要扩写你想写的字段
mobile=models.CharField(max_length=32)
icon=models.ImageField(upload_to='/icon/',default='default.png')
-2 在settings.py 配置
AUTH_USER_MODEL='app01.UserInfo'
-3 之前不要迁移数据,一旦迁移过,就不行了
-一旦迁移过了,按这个步骤操作
-1 删库
-2 删迁移文件(所有你写的app都删)
-3 删除源码中 auth和admin的迁移文件---》写在djagno重装
缓存
页面静态化
缓存---》本身数据在数据库中---》如果访问量较大---》每次都需要去数据库查询---》影响效率---》我们可以对数据做缓存--》以后先从缓存中取数据--》如果取到直接返回---》不需要查数据库---》如果取不到---》再查数据库---》查完放到缓存中
django 默认就支持缓存---》缓存到的位置
内存缓存(演示)
文件缓存
数据库缓存
redis缓存(后期会用)
默认情况,缓存到内存中
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
}
}
缓存到文件中
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎
'LOCATION': 'D:\Python27\django_05\cache', #指定缓存的路径
'TIMEOUT':300, #缓存超时时间(默认为300秒,None表示永不过期)
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
}
}
}
缓存的具体使用---》三种粒度
- 全站缓存---》只需要配置两个中间件即可
- 视图缓存
- 局部缓存---》在页面某个位置缓存
全站缓存,使用方式-如下-只需要配置中间件即可
MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware',
。。。。。
'django.middleware.cache.FetchFromCacheMiddleware'
]
视图缓存
from django.views.decorators.cache import cache_page
@cache_page(timeout=10)
def demo09(request):
print('来了老弟')
book_list = Book.objects.all()
return render(request, 'books.html', {'books': book_list})
局部缓存
{% load cache %}
{% cache 10 'name' %}
可以能有很多代码
{% endcache %}