zoukankan      html  css  js  c++  java
  • Django的auth【认证】模块简介

    首先我们先来复习一下路由别名如何使用,这里仅仅复习一下二级路由的路由别名该如何使用

    ·1、在视图函数中使用二级路由别名,需要加上app的名称+“:”+ “路由别名”

    from django.urls import reverse
    
    return redirect(reverse("app1:auth_index_view"))
    

      

    2、在html文件中使用二级路由的别名,也 要通过app名在冒号来查找路由别名

    <form action="{% url 'app1:auth_login_view_name' %}" method="post" novalidate >
        {% csrf_token %}
        {{ obj.username.label_tag }}{{ obj.username }}
        <span>{{ obj.errors.username.0 }}</span>
        {{ obj.userpwd.label_tag }}{{ obj.userpwd }}
        <span>{{ obj.errors.userpwd.0 }}</span>
    {#    <a href="{% url 'app1:auth_login_view_name' %}">点我大</a>#}
        <input type="submit" value="提交">
    
    </form>
    

      

    这里需要注意一下,如果是使用django2.0的版本,也就是url中使用path方法的话,如果要使用路由别名,需要按照下面的方式处理

    在project的urls中按照这样设计

    urlpatterns = [
        path('admin/', admin.site.urls),
        path('app1/', include("app1.urls")),
        path('auth/', include("my_auth_app.urls",namespace="my_auth_app")),
    ]
    

      

    在对应的app中按照下面的方式设计,务必要价格app_name的变量才可以正常使用路由别名

    from django.contrib import admin
    from django.urls import path
    from django.urls import include
    from my_auth_app import views
    app_name = '[my_auth_app]'
    urlpatterns = [
    
        # path('admin/', admin.site.urls),
        path('login/',views.login,name="auth_login"),
        path('index/',views.index,name="auth_index"),
        path('logout/',views.logout,name="auth_logout"),
    ]
    

      

    下面我们正式进入auth模块的学习

    1、首先需要导入两个模块

    from django.contrib import auth
    

      

    from django.contrib.auth.models import User
    # 创建用户的模块
    

      

    2、然后这里是auth模块的具体的使用的方法

    def auth_login_view(request):
        method_type = request.method.lower()
        if method_type == "get":
            form_obj = my_new_forms()
    
            return render(request,"auth_login.html",{
                "obj":form_obj
            })
        else:
            username = request.POST.get("username")
            userpwd = request.POST.get("userpwd")
            user = auth.authenticate(username=username,password=userpwd)
            # 这里必须是user用其他的都不行,验证用户名和密码是否通过校验,如果通过则返回一个usr对象,如果不通过,则返回一个匿名用户对象
    
            if user:
                auth.login(request,user)
                # 把username这个信息封装到request.user中
    
                print(dir(user))
    
    
                from django.contrib.auth.models import User
                new_common_user = User.objects.create_user()
                # 创建普通用户
    
                new_super_user = User.objects.create_superuser()
                # 创建超级管理员用户
    
    
                error_create_user = User.objects.create()
                # 我们不用这个方法创建用户,这个方法创建的用户的密码不是加密的,一般也不能用
    
    
                user = User.objects.get(username="aaa")
                user.set_password()
                user.save()
                # 修改密码,这里需要保存才能生效
    
    
                user.check_password()
                # 用户需要修改密码的时候,首先先判断当前输入的密码对不对
    
    
    
                return redirect(reverse("app1:auth_index_view"))
            else:
                return redirect(reverse("app1:auth_login_view_name"))
    

      

    3、auth模块还自带一个装饰器,用来判断用户是否登陆,也需要先导入一个模块

    from django.contrib.auth.decorators import login_required
    # 判断用户是否登陆的装饰器
    

      

    @login_required
    # django自带的装饰器,判断某个用户是否登陆
    def auth_index_view(request):
        print(request.user.is_authenticated())
        # 判断某个用户是否登陆,如果是则返回true
    
        return render(request,"auth_index.html",{"name":request.user.username})
    

      

    这里如果用户没有登陆成功,则页面需要跳转到某个页面,这个页面需要在settings中配置

    # 如果没有登陆地登陆,默认跳转到哪个url
    LOGIN_URL = "http://www.baidu.com"
    

      

    4、auth模块的注销的方法

    def logout(request):
        auth.logout(request)
        # auth.logout方法,删除cookies和seesion
    
        return redirect(reverse("app1:auth_login_view_name"))
    

      

    另外,django默认的user表中只有有限的字段,如果我们想扩展其中的字段该怎么处理呢,这里我们有2种办法可以处理

    方法1,新建一个表,一对一到user表中

    # 1、新建一个表,一对一关联auth_user表
    from django.contrib.auth.models import User
    # 先把django自带的user这个表导入
    
    
    class User_detail(models.Model):
        phone = models.CharField(max_length=11)
        usr_obj = models.OneToOneField(to=User)
        # 一对一关联到django自带的user表
    

      

    方法2,使用继承的方法,这里需要注意,如果使用继承的方法,则django的数据库中就乜有auth_user表中了,所以上面的方法中如果用auth_user这个表,则只需要修改表明为我们的表名称

    from django.contrib.auth.models import AbstractUser
    
    # Create your models here.
    
    class Userinfo(AbstractUser):
    
        iphone = models.CharField(max_length=11,null=True,blank=True)
        email = models.CharField(max_length=64,null=True,blank=True)
        create_time = models.DateTimeField(auto_now_add=True,blank=True)
    
        def __str__(self):
            return self.username
    

      

    然后需要在setting中设置

    AUTH_USER_MODEL = "app1.Userinfo"
    

      

    django就没有User表了,替换为我们的Userinfo表了,我们新添加的字段也补充进去了

    如果我们采用扩展的方式扩展默认的user表,则auth模块还是可以继续使用的,但是如果要创建新的用户,则需要使用我们新创建的表

                    from app1 import models
                    user_obj = models.Userinfo.objects.create_user(username="alex5", password="alexdsb")
    

     

    我们可以看到创建的新的用户成功了

     

     我们使用新的用户登陆

    同样如果要修改密码,也需要到新的表中操作

                    user_obj = models.Userinfo.objects.filter(username="alex5")[0]
                    user_obj.set_password("admin123.")
                    user_obj.save()
    

      

  • 相关阅读:
    Docker Machine 管理-管理machine(17)
    Docker Machine 管理-创建machine(16)
    Docker Machine 管理-安装docker-machine(15)
    kvm无人值守安装centos6
    存储-docker volume 生命周期管理(14)
    存储-docker数据共享(13)
    存储-docker存储(12)
    网络-Docker 提供的几种原生网络和自定义网络(11)
    docker容器管理-含静态Ip(10)
    rocketmq单点部署
  • 原文地址:https://www.cnblogs.com/bainianminguo/p/9795471.html
Copyright © 2011-2022 走看看