django之auth模块

目录

          • 一、补充知识点importlib
          • 二、Auth模块
            • urls.py
            • views.py
            • set_password.html
            • login.html与register.html

一、补充知识点importlib
  • importlib可以通过字符串的形式导包,常用于settings全局启动时使用,但是需要注意最小单位只能到模块名
    import importlib
    res = 'myfile.b'
    ret = importlib.import_module(res)   # from myfile import b
    # 该方法最小只能到py文件名
    print(ret)
    
  • 功能的插拔式设计
    • ① 配置文件注册功能
    • ② importlib模块
    • ③ 字符串切割split
    • ④ 反射
    • ⑤ 面向对象及鸭子类型
    import settings
    import importlib
    
    
    
    def send_all(content):
        for path_str in settings.NOTIFY_LIST:     # notify.email.Email
            module_path, class_name = path_str.rsplit('.', maxsplit=1)    # module_path = 'notify.email'   class_name = 'Email'
            # 1、利用字符串导入模块
            module = importlib.import_module(module_path)   # from notify import email
            # 2、利用反射获取类名
            cls = getattr(module, class_name)   # Email、QQ、Wechat
            # 3、生成类的对象
            obj = cls()
            # 4、利用鸭子类型直接调用send方法
            obj.send(content)
    
二、Auth模块
  • django推荐
  • 其实我们在创建好一个django项目只会直接执行数据库迁移命令会自动生成很多表,django_session,auth_user;
  • django在启动只会就可以直接访问admin路由,需要输入用户名和密码,数据参考的就是auth_user表,并且还必须式管理用户才能进入;
  • auth_user表添加用户,创建超级用户(管理员)python3 manage.py createsuperuser依赖于auth_user表完成用户相关的所有功能
  • 方法1:比对密码是否正确
    user_obj = auth.authenticate(request, username=username, password=password)
    print(user_obj)  # 用户对象 shirmay  数据不符合则返回None
    print(user_obj.username)
    print(user_obj.password)   # 密文
    
  • 方法2:保存用户状态
    auth.login(request, user_obj)  # 保存用户状态 类似于 request.session[key] = user_obj
    # 只要执行力该方法,你就可以在任何地方通过request.user获取当前登录的用户表
    
  • 方法3:判断当前用户是否登录
    # 判断用户是否登录
    print(request.user.is_authenticated)
    
  • 方法4:获取当前登录用户
    request.user
    
  • 方法5:校验用户是否登录装饰器
    from django.contrib.auth.decorators import login_required
    @login_required(login_url='/login/')  # 局部配置:用户没有登录跳转到login_user后面指定的网址
    @login_required   # 全局配置,在settings.py里面写# 全局配置:没有登录跳转到指定的页面 LOGIN_URL = '/login/'
    
  • 方法6:比对原密码
    request.user.check_password(old_password)
    
  • 方法7:修改密码
    # 修改密码
    request.user.set_password(new_password)  # 仅仅是修改对象的属性
    request.user.save()   # 这一步才是真正的操作数据库
    
  • 方法8:注销
    auth.logout(request)
    
  • 方法9:注册
    	# 创建普通用户
    	User.objects.create_user(username=username, password=password)
    	```
    
  • auth_user表扩展之models.py; settings.py配置AUTH_USER_MODEL = ‘app03auth.UserInfo’ (即应用名.表名)
    from django.db import models
    from django.contrib.auth.models import User, AbstractUser
    
    
    # 面向对象的继承
    class UserInfo(AbstractUser):
        """
        如果继承了AbstractUser
        那么在执行数据库迁移命令的时候auth_user表就不会再创建出来了
        而UserInfo表中会出现auth_user所有的字段外加自己扩展的字段
        这么做的好处在于你能够直接点击你自己的表更加快速的完成操作及扩展
        前提:在继承之前没有执行过数据库迁移命令, auth_user没有被创建,如果已经创建那么就重新换一个库
            继承的类里面不要覆盖AbstractUser里面的字段名
            表里面的字段都不要动,只扩展就行
            需要在配置文件中告诉django你要用UserInfo替代auth_user : AUTH_USER_MODEL = 'app03auth.UserInfo' (即应用名.表名)
        如果自己的表替代了auth_user,那么auth模块的功能还是照常使用,参考的表也由原来的auth_user变成了UserInfo
        """
        phone = models.BigIntegerField()
        create_time = models.DateTimeField(auto_now_add=True)
    
    
urls.py
from django.conf.urls import url
from django.contrib import admin
from app03auth import views

urlpatterns = (
    url(r'^admin/', admin.site.urls),
    # 登录功能
    url(r"^login/", views.login),
    # 校验用户是否登录
    url(r"^home/", views.home),
    url(r"^index/", views.home),
    # 修改密码
    url(r"^set_password/", views.set_password),
    # 注销功能
    url(r"^logout/", views.logout),
    # 注册功能
    url(r"^register/", views.register)


)

views.py
from django.shortcuts import render, redirect, HttpResponse
from django.contrib import auth
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User


def login(request):
    """使用auth模块要用就用全套"""
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user_obj = auth.authenticate(request, username=username, password=password)
        print(user_obj)
        if user_obj:
            auth.login(request, user_obj)  # 保存用户状态 类似于 request.session[key] = user_obj
            # 只要执行力该方法,你就可以在任何地方通过request.user获取当前登录的用户表
            return redirect('/app03/home/')

    return render(request, 'login.html')


# @login_required(login_url='/login/')  # 局部配置:用户没有登录跳转到login_user后面指定的网址
@login_required   # 全局配置,在settings.py里面写# 全局配置:没有登录跳转到指定的页面 LOGIN_URL = '/login/'
# 优先级局部大于全局
# 全局的好处在于无需重复写代码,但是跳转的页面却很单一
# 局部的好处在于不同的视图函数在用户没有登陆的情况下可以跳转到不同的页面
def home(request):
    """用户登录之后才能看home"""
    print(request.user)
    # 判断用户是否登录
    print(request.user.is_authenticated)
    # 自动去django_session里面查找对应的用户对象给你封装到request.user中
    return HttpResponse('OK')


@login_required
def index(request):
    return HttpResponse('login_url')


@login_required
def set_password(request):
    if request.method == 'POST':
        old_password = request.POST.get('old_password')
        new_password = request.POST.get('new_password')
        confirm_password = request.POST.get('confirm_password')
        if new_password == confirm_password:
            # 校验老密码对不对
            is_right = request.user.check_password(old_password)   # 自己加密对比密码
            if is_right:
                # 修改密码
                request.user.set_password(new_password)  # 仅仅是修改对象的属性
                request.user.save()   # 这一步才是真正的操作数据库
        return redirect('/app03/login/')
    return render(request, 'set_password.html', locals())


@login_required
def logout(request):
    auth.logout(request)  # 类似于 request.session.flush()
    return redirect('/app03/login/')


def register(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 创建普通用户
        User.objects.create_user(username=username, password=password)
    return render(request, "register.html")
set_password.html
DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>
    <form action="" method="post">
        {% csrf_token %}
        <p>username:<input type="text" name="username" class="form-control" disabled value="{{ request.user.username }}">p>
        <p>old_password:<input type="text" name="old_password" class="form-control">p>
        <p>new_password:<input type="text" name="new_password" class="form-control">p>
        <p>confirm_password:<input type="text" name="confirm_password" class="form-control">p>
        <input type="submit" class="btn btn-success btn-block">
    form>

body>
html>
login.html与register.html
DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登陆title>


    {% load static %}
    <script src="{% static 'bootstrap-3.3.7-dist/js/jquery-3.5.1.min.js' %}">script>
    <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}">script>
    <link rel="stylesheet" href= "{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <h1>注册h1>
    <p>username:<input type="text" name="username" class="form-control">p>
    <p>password:<input type="password" name="password" class="form-control">p>
    <input type="submit" class="btn btn-success btn-block">
form>

div>
body>
html>

你可能感兴趣的:(#,PythonKnowledge,django,python,数据库)