• auth验证


    一  auth模块

    auth是Django内部的用户认证系统,它默认使用 auth_user 表来存储用户数据。

    from django.contrib import auth

    1. create_user()

    auth 提供的一个创建新用户的方法,需要提供必要参数(username、password)等。

    from django.contrib.auth.models import User
    user = User.objects.create_user(username='用户名',password='密码',email='邮箱',...)

    注意:create方法加入数据库中的密码都是明文

    2. create_superuser()

    auth 提供的一个创建新的超级用户的方法,需要提供必要参数(username、password)等。

    from django.contrib.auth.models import User
    user_obj = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)

    或者:

    python manage.py createsuperuser

    3. authenticate()   

    验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。如果认证成功,返回一个 User 对象,不成功返回None

    authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。

    user = authenticate(username='theuser',password='thepassword')

    4. login(HttpRequest, user)  

    该函数接受一个HttpRequest对象,以及一个经过认证的User对象。实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据

    from django.contrib import auth
    def login(request):
        if request.method == 'POST':
            username = request.POST.get('username')
            pwd = request.POST.get('password')
            # User.objects.create_user(is_active=True, username=username, password=pwd, is_staff=True)
            user = auth.authenticate(username=username, password=pwd)
            if user:
                auth.login(request, user)   #生成session
                return redirect('/app01/index/')
        return render(request, 'login.html')

    注意:

    在没有login_requierd()的前提下,只要使用login(request, user_obj)之后,request.user就能拿到当前登录的用户对象。否则request.user得到的是一个匿名用户对象(AnonymousUser Object)。

    5. logout(request) 

    该函数接受一个HttpRequest对象,无返回值。

    当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。本质就是:request.session.flush()

    def logout(request):
        auth.logout(request)
        return HttpResponse('注销成功')

    注意:session只是以浏览器为依据,在同一浏览器上,后登陆的用户会把先前登陆的用户注销

    6. is_authenticated()

    用来判断当前请求是否通过了认证。

    def my_view(request):
      if not request.user.is_authenticated():
        return redirect('%s?next=%s' %(request.path))

    7. login_requierd()

    auth 给我们提供的一个装饰器工具,用来快捷的给某个视图添加登录校验。

    from django.contrib.auth.decorators import login_required
    @login_required
    def my_view(request):
        ...

    若用户没有登录,则会跳转到django默认的登录URL '/accounts/login/ ' 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。

    如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。

    LOGIN_URL = '/login/'  # 这里配置成你项目登录页面的路由

    8. check_password(raw_password)

    auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。

    密码正确返回True,否则返回False。

    ok = user_obj.check_password('密码')

    或者直接针对当前请求的user对象校验原密码是否正确:

    ok = request.user.check_password(raw_password='原密码')

    9. set_password(raw_password)

    auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。

    注意:设置完一定要调用用户对象的save方法!

    user_obj.set_password('新密码')
    user_obj.save()

    二  扩展auth_user表

    1. 新建表, 一对一关联

    在models写入:

    from django.db import models
    from django.contrib.auth.models import User
    class UserDetail(models.Model):
        phone = models.CharField(max_length=11)
        user2phone = models.OneToOneField(to=User, on_delete=models.CASCADE,related_name='phone2user')

    2. 继承的方式

    新建表app01_userinfo代替auth_user,auth_user不再存在。该方法在一开始便创建好,避免后期修改。

    from django.contrib.auth.models import AbstractUser
    class UserInfo(AbstractUser):
        phone = models.CharField(max_length=11)
        addr = models.CharField(max_length=128)

    注意:在settings.py中一定要加入:AUTH_USER_MODEL = 'app名.类名', 告诉Django项目用哪张表做认证

    AUTH_USER_MODEL = 'blog.UserInfo'

    实例:

    # 继承前
    def register(request):
        from django.contrib.auth.models import User
        user_obj = User.objects.create_user(username="matt", password="123")
    # 使用继承后,就没有User了,创建新用户需要改变
    def register(request):
        from app01.model import models
        user_obj = modles.Userinfo.objects.create_user(username="matt", password="123"

     参考:

    https://www.cnblogs.com/zgf-666/p/9124261.html

     

     

  • 相关阅读:
    npm 全局执行 update 、 outdated 出现 npm-debug.log 404 错误的问题
    python 爬虫爬取内容时, xa0 、 u3000 的含义
    SCNU ACM 2016新生赛决赛 解题报告
    SCNU ACM 2016新生赛初赛 解题报告
    【记录】Ubuntu下安装VirtualBox
    Ubuntu16.04 LTS下apt安装WireShark
    Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究
    Ubuntu在wps-office等qt5程序下不能切换中文fcitx输入法的问题
    Ubuntu管理开机启动服务项 -- 图形界面的Boot-up Manager
    解决Ubuntu下Firefox+OpenJDK没有Java插件的问题
  • 原文地址:https://www.cnblogs.com/mushuiyishan/p/11616798.html
Copyright © 2020-2023  润新知