django auth模块

django auth模块

csrf相关装饰器

# 导入模块
from django.views.decorators.csrf import csrf_exempt,csrf_protect

# csrf_exempt 
忽略csrf校验
# csrf_protect
开启csrf校验

# 针对FBV
@csrf_protect\@csrf_exempt
def login(request):
    return render(request,'login.html')

# 针对CBV
csrf_protect 三种CBV添加装饰器的方式都可以
csrf_exempt  只有一种方式可以生效(给重写的dispatch方法装)

字符串形式导入模块

# importlib模块
import importlib	
可以通过字符串的形式导入模块

# 常规导入方式
from ccc import b
# 字符串导入方式
import importlib
module_path = 'ccc.b'
res = importlib.import_module(module_path)
'最小导入单位是模块文件级别'

功能的插拔式设计

# 以发送提示信息为需求 编写功能
方式1:封装成函数
方式2:封装成配置
    
# 封装成配置的形式

# settings.py
NOTIFY_FUNC_LIST = [
    'notify.email.Email',
    'notify.msg.Msg',
]
# email.py
class Email(object):
    def __init__(self):
        pass	# 模拟发送短信需要提前准备的操作
    def send(self,msg):
        print('短信提示:%s'%msg)


# __init__.py
import settings
import importlib
def send_all(msg):
    # 1.循环获取配置文件中字符串信息
    for str_path in settings.NOTIFY_FUNC_LIST:  # 'notify.email.Email'
        # 2.切割路径信息
        module_path, class_str_name = str_path.rsplit('.', maxsplit=1)  # ['notify.email','Email']
        # 3.根据module_path导入模块文件
        module = importlib.import_module(module_path)
        # 4.利用反射获取模块文件中对应的类名
        class_name = getattr(module, class_str_name)  # Email  Msg  QQ
        # 5.实例化
        obj = class_name()
        # 6.调用发送消息的功能
        obj.send(msg)

auth模块

# django提供给你快速完成用户相关功能的模块
	用户相关功能:创建、认证、编辑...用户相关操作
# django也配套提供了一张'用户表'
	执行数据库迁移命令之后默认产生的auth_user
# django自带的admin后台管理用户登录参考的就是auth_user表
创建admin后台管理员用户:
run manage.py task>>:createsuperuser
python3 manage.py createsuperuser
  自动对用户密码进行加密处理并保存
    
'''django在启动之后就可以直接访问admin路由,需要输入用户名和密码,数据参考的就是auth_user表,并且还必须是管理员用户才能进入'''

auth模块方法

比对用户名和密码是否正确

'比对用户名和密码是否正确'
# 导入auth模块
from django.contrib import auth

# 1.比对用户名和密码是否正确
user_obj = auth.authenticate(request,username=username,password=password)

# 括号内必须同时传入用户名和密码
print(user_obj)  # 用户对象  jason   数据不符合则返回None
print(user_obj.username)  # jason
print(user_obj.password)  # 密文

保存用户状态

'保存用户状态 自动操作sesson相关'
auth.login(request,user_obj) 
# 类似于request.session[key] = user_obj
'''执行了该方法 你就可以在任何地方通过request.user获取到当前登陆的用户对象'''

# 获取当前登录用户
print(request.user)  # 用户对象   
'''
没登陆拿到的是匿名用户 AnonymousUser
自动去django_session里面查找对应的用户对象给你封装到request.user
'''

# 判断当前用户是否登录
print(request.user.is_authenticated())
'''
返回True 则说明用户登录
返回False 则说明用户未登录
'''

校验登录装饰器

# 导入模块
from django.contrib.auth.decorators import login_required

# 局部配置
@login_required(login_url='/lg/') 

# 全局配置settings内
LOGIN_URL = '/lg/'
@login_required

'''
全局的好处在于无需重复写代码 但是跳转的页面却很单一
局部的好处在于不同的视图函数在用户没有登陆的情况下可以跳转到不同的页面
'''

修改密码

# 比对原密码
check_password 原密码
# 返回一个布尔值
is_right = request.user.check_password(old_password)  
'自动加密比对密码'

# 判断原密码正常为True 原密码错误为False
if is_right:
    # 修改密码
    request.user.set_password(new_password)  # 添入新密码(仅仅修改对象的属性)
    request.user.save()  # 将修改数据同步到数据库

注销功能

auth.logout(request)  # 类似于 request.session.flush()

注册功能

# 注册用户
1.操作auth_user表写入数据
User.objects.create(username=username,password=password)  
'不能用create 密码没有加密处理'

2.创建普通用户  # 加密处理
User.objects.create_user(username=username,password=password)

3.创建管理员:
'使用代码创建管理员 邮箱是必填的 而用命令创建则可以不填'   
User.objects.create_superuser(username=username,email='123@qq.com',password=password)

auth扩展表字段

# 前提
1.在继承之前没有执行过数据库迁移命令(auth_user没有被创建)
如果当前库已经创建了,那么你就重新换一个库

2.继承的类里面不要覆盖AbstractUser里面原有的字段名
表里面有的字段都不要动,只扩展额外字段即可

3.需要在配置文件中告诉Django你要用MyUser替代auth_user
AUTH_USER_MODEL = 'app01.MyUser' 	# 应用名点表名

# 方式1:编写一对一表关系(了解)

# 方式2:类继承(推荐)
from django.contrib.auth.models import AbstractUser
class Users(AbstractUser):
    # 编写AbstractUser类中没有的字段 不能冲突!!!
    phone = models.BigIntegerField(null=True)
    addr = models.CharField(max_length=32)

# settings.py
AUTH_USER_MODEL ='app01.MyUser'

优化处理

'对模型表进行配置'
# 继承系统的user表
class UserInfo(AbstractUser):
    mobile = models.CharField(max_length=11, unique=True)

    class Meta:
        # 更改数据库的表名
        db_table = 'user'
        # 更改后台显示的表名
        verbose_name_plural = '系统用户表'

    def __str__(self):
        return self.username
    
    

    
    
# 通过Admin.py将表注册到后台管理页面
'''admin.py'''

from django.contrib import admin

# Register your models here.
from app01 import models
# 注册models中的八张表
admin.site.register(models.UserInfo)
admin.site.register(models.Blog)
admin.site.register(models.Article)
admin.site.register(models.Tag)
admin.site.register(models.Category)
admin.site.register(models.Article_Tag)
admin.site.register(models.Comment)
admin.site.register(models.UpAndDown)

# admin注册自定义User表:密文操作密码
from django.contrib.auth.admin import UserAdmin
class UserInfo(UserAdmin):
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            # 添加用户界面可操作的字段
            'fields': ('username', 'password1', 'password2', 'mobile', 'email', 'is_staff', 'is_active'),
        }),
    )
    list_display = ('username', 'mobile', 'email', 'is_staff', 'is_active')

# 明文操作密码,admin可视化添加的用户密码都是明文,登录时用的是密文,所以用户无法登录
# admin.site.register(models.User)
admin.site.register(models.UserInfo, UserInfo)

posted @   洛阳城门听风雨  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示