Django中的Auth模块

注意事项:
AUTH_USER_MODEL = 'app01.UserInfo' (先到settings.py配置文件中配置)
AUTH_USER_MODEL = '应用名.用户表名'

如果不配置,就无法正常使用

"""
在models表写好之后,运行数据库迁移命令(makemigrations  migrate)
数据库中会自动生成很多表,auth_user表,这个表可以进行扩展,在下面会写

所以
AUTH_USER_MODEL = 'app01.UserInfo'
这里的的用户表名,可以写自己扩展的用户表名,其实它就是auth_user

"""

常用方法总结

from django.contrib import auth

1 '比对账号和密码是否正确'

if request.method == 'POST':
    username = request.POST.get('username')
    password = request.POST.get('password')
    # 去用户表中校验数据
    # 1 表如何获取
    * 2 '密码如何比对'
    user_obj = auth.authenticate(request, username=username, password=password)
    	# 括号内必须同时传入用户名和密码
    # print(user_obj)  # 用户对象,
    # print(user_obj.username)  # 用户名
    # print(user_obj.password)  # 密文密码
    
····························
2 '保存用户状态'
if user_obj:
    # 保存用户状态
    auth.login(request, user_obj)  # 类似于 request.session[key] = user_obj
    # 只要执行了该方法,就可以在任何地方通过request.user 获取到当前登录的用户对象
    return redirect('/home.html/')
        
···························     
3 '判断当前用户是否登录'
request.user.is_authenticated()  #  返回False/True

is_authenticated() 方法是用来判断用户是否已经登录(是否认证通过)的方法。当你需要在代码中进行布尔判断时,不需要加括号,直接使用这个方法即可。

if request.user.is_authenticated:
    # 用户已登录,执行相应操作
else:
    # 用户未登录,执行其他操作
    
在这个示例中,is_authenticated 后面没有加括号,因为它本身就是一个属性,表示一个布尔值,用于判断用户是否已经登录。
    
····························  
4 '获取当前登录用户'
request.user
····························          
5 '比对原密码'
# 校验老密码对不对
is_right = request.user.check_password(old_password)  # 修改密码前先比对

····························          
6 '修改密码(两步)'
request.user.set_password(new_password)  # 仅修改对象的属性,不写入数据库
request.user.save()  # 这一步是真正的操作数据库

···························· 
7 '注销'
auth.logout(request)     #将当前登录的用户退出登录

····························

8 '注册'
from django.contrib.auth.models import User # 操作user表 要导入这个
# 1 操作auth_user表,写入数据(这种方法,密码不会自动加密)  
User.objects.create(username=username,password=password)

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

# 3 创建超级用户(了解):使用代码创建超级用户,邮箱是必填的,命令行创建可以不填
User.objects.create_superuser(username=username,email='[email protected]',password=password)

Auth模块验证登录状态的装饰器

'给方法添加登录才可以用的装饰器'
from django.contrib.auth.decorators import login_required



# 局部配置 没有登录就跳到指定页面
@login_required(login_url='/login/')



# 全局配置 
LOGIN_URL = '/login/'   # 写在sttions中
@login_required			# 写在方法名上

1 当装饰器局部配置和全局配置同时存在
 局部 > 全局  (优先执行局部的)
2 全局和局部有什么不同?
    全局的好处在于无需重复写代码,但是跳转的页面却很单一 
    局部的好处在于用户还没登录的时候,可以跳转到不同的页面


# 两个例子
@login_required
def set_password(request):
    pass
@login_required(login_url='/login/')
def set_password(request):
    pass

如何扩展auth_user表

'扩展auth表的两种方式'




#第一种 : 一对一关系 (不推荐)
class UserDetail(models.Model):
    phone = models.BigIntegerField()
    user = models.OneToOneField(to='User')






# 第二种: 利用面向对象的继承
# 写一个类继承AbstractUser
class UserInfo(AbstractUser):
    phone =models.BigIntegerField()
    create_time = models.DateTimeField(auto_now_add=Ture)


 如果继承了AbstractUser
    那么再执行数据库迁移命令的时候auth_user表就不会再创建出来了
    而Userinfo表中会出现auth_user所有的字段外加自己扩展的字段
    这么做的好处在于,能够直接点击自己的表,更加快速的完成操作及扩展



前提:
        1 在继承之前没有执行过数据库迁移命令
          auth_user没有被创建,如果当前库已经被创建了,那么就重新换一个库
        2 继承的类里面,不要覆盖AbstractUser里面的字段名
            表里面有的字段都不要动,只扩展就行
        3 需要在配置文件中告诉django,要用UserInfo替代auth_user
            不然以后的数据不会添加到表中
            AUTH_USER_MODEL = 'app01.UserInfo'
                                '应用名.表名'



'总结'
  	如果自己写表替代了auth_user
    auth模块的功能还是自己使用,参考的表页由原来的auth_user变成了UserInfo
    
    '之前源码中  .user的地方都换成了 .UserInfo(自己创建的表)'
    例如:
    	request.user.set_password(new_password)  # 改为下面的
    	request.UserInfo.set_password(new_password)  

你可能感兴趣的:(django,django,python)