尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

59. django之字符串形式导入模块_auth

59. django之字符串形式导入模块_auth
📅 发布时间:2026/7/11 23:06:58

1. 字符串形式导入模块

在项目根目录里定义目录a、文件b,目录a里定义文件a

文件a里的变量值为字符串

image

当需要在文件b里使用文件a里的变量时:

方式一:常规导入

文件b中通过目录a导入文件a

image

在文件b中打印filea,为模块名称

image

方式二:通过字符串导入

打印的res与方式一打印的文件名一致

importlib能导入的最小层级为文件,不是函数和类

image

2. 基于django中间件思想将函数功能封装成配置文件形式

2.1 引入

notify.py中定义内容发送方式函数

def send_email(content):print(f'邮箱发送的内容为{content}')def send_msg(content):print(f'短信发送的内容为{content}')def send_telegram(content):print(f'电报发送的内容为{content}')def send_all(content):send_email(content)send_msg(content)send_telegram(content)

start.py中定义启动脚本

from notify import send_allsend_all('world cup')

image

当需要取消通过email发送时,需要notify.py源码中注释send_email(content)代码

2.2 模拟settings.py里中间件的写法

[1] 基础版本

项目根目录里定义notify目录,该目录里定义功能的py文件

image

email.py

class Email(object):def __init__(self):# 模拟发送邮件需要提前准备的操作passdef send(self, content):print(f'邮箱发送的内容为{content}')

msg.py

class Msg(object):def __init__(self):# 模拟发送短信需要提前准备的操作passdef send(self, content):print(f'短信发送的内容为{content}')

telegram.py

class Msg(object):def __init__(self):# 模拟发送短信需要提前准备的操作passdef send(self, content):print(f'短信发送的内容为{content}')

settings.py中模拟中间件的写法,将 目录-文件-类 写成字符串的形式

NOTIFY_FUNC_LIST = ['notify.email.Email','notify.msg.Msg','notify.telegram.Telegram'
]

在notify目录里新建_ _init_ _.py文件,将目录变为包

在包内导入配置文件,使用importlib通过字符串的形式导入这个包里面的所有模块

导入模块之后实现在包内注册当前包下面的所有模块(文件路径)和功能(类名)

import settings
import importlibdef send_all(content):for i in settings.NOTIFY_FUNC_LIST:  # 1.循环获取settings.py中的字符串'notify.email.Email'file_path, class_str = i.rsplit('.', maxsplit=1)  # 2.得到文件路径和类名module1 = importlib.import_module(file_path)  # 3.根据文件路径导入该文件,module1即为文件名# 4.利用反射获取模块文件里对应的类名,反射:通过字符串的形式去对象里获取属性或方法class_name = getattr(module1, class_str)  # 5.获取到的是真正的类的名称obj = class_name()  # 6.类实例化产生对象obj.send(content)  # 7.调用发送消息的功能

定义启动脚本start.py

import notifyif __name__ == '__main__':notify.send_all('world cup')

运行启动脚本

image

[2] 增加函数

当需要增加函数时,定义py文件、定义类与函数、配置文件中增加字符串即可

image

[3] 取消函数

当需要取消函数时,配置文件中注释即可

image

3. auth模块

3.1 概念

Django 内置的auth 认证模块用于处理用户认证、权限管理、会话登录。

创建django项目,运行数据库迁移命令会自动生成很多表。

image

image

Django在启动之后就可以直接访问admin路由,需要输入用户名和密码,数据参考的就是auth_user表,并且必须是管理员用户才能进入。

image

3.2 创建超级用户(管理员)

工具--运行manage.py任务  createsuperuser

manage.py@dj07 > createsuperuser
D:\explain3\python.exe "D:\PyCharm 2023.3.6\plugins\python\helpers\pycharm\django_manage.py" createsuperuser D:/project/dj07
Tracking file by folder pattern:  migrations
Username (leave blank to use '***host'):  avril
Email address:  123@mit.com
Warning: Password input may be echoed.
Password:  canada@2013
Warning: Password input may be echoed.
Password (again):  canada@2013
Superuser created successfully.

 image

前端登录

image

3.3 使用auth_user表完成注册登录功能

[1] 基础登录

项目的urls.py定义路由

from django.contrib import admin
from django.urls import path
from app01 import viewsurlpatterns = [path('admin/', admin.site.urls),path('app01/login/', views.login),
]

app01的login.html

<body>
<form action="" method="post">{% csrf_token %}<p>用户名:<input type="text" name="username1"></p><p>密码:<input type="text" name="password1"></p><input type="submit">
</form>
</body>

app01的views.py

from django.shortcuts import render, HttpResponse
from django.contrib import auth# Create your views here.def login(request):if request.method == 'POST':# 1.获取前端输入的用户名密码username2 = request.POST.get('username1')password2 = request.POST.get('password1')# 2.将前端获取到用户名密码与auth表中的数据比对# 3.表中是密文,需要导入auth模块校验from django.contrib import authuser_obj = auth.authenticate(username=username2, password=password2)# 4.校验正确打印的是用户对象,错误返回的是none# 5.打印的值不是字符串,而是对象封装的一个__str__方法print(user_obj, type(user_obj))print(user_obj.username)print(user_obj.password)return render(request, 'login.html')

输入正确的用户名点击提交

image

image

[2] 保存登录状态

auth.login(request, user_obj)
  类似于 request.session[key] = user_obj
  只要运行了该方法,就可以在任何地方通过 request.user 获取当前用户的登录对象

app01的views.py

def login(request):if request.method == 'POST':# 1.获取前端输入的用户名密码username2 = request.POST.get('username1')password2 = request.POST.get('password1')# 2.将前端获取到用户名密码与auth表中的数据比对# 3.表中是密文,需要导入auth模块校验from django.contrib import authuser_obj = auth.authenticate(username=username2, password=password2)if user_obj:# 4.保存用户登录状态,自动操作session
            auth.login(request, user_obj)return render(request, 'login.html')

image

输入正确用户名密码提交之后自动生成session

image

image

[3] 查看是否登录

request.user 是 Django 认证系统的核心入口对象,它将无状态的 HTTP 请求与有状态的用户身份绑定在一起。
已登录时:request.user 是 User 模型(或你自定义的用户模型)的实例
未登录时:request.user 是 AnonymousUser 的单例实例

request.user.is_authenticated())   # 匿名用户返回 False

项目的路由

urlpatterns = [path('admin/', admin.site.urls),path('app01/login/', views.login),path('app01/check_login/', views.check_login),
]

app01的views.py

def check_login(request):# user为系统自带:点击查看class AuthenticationMiddlewareprint(request.user)return HttpResponse('查看当前用户是否已经登录')

在步骤[2]中登录并保存状态

image

image

image

当注销登录时

image

image

image

[4] 登录后才能访问的页面

(1) 局部配置登录后才能访问的页面

项目的urls.py

urlpatterns = [path('admin/', admin.site.urls),path('app01/login/', views.login),path('app01/check_login/', views.check_login),path('app01/home/', views.home),path('app01/index/', views.index),path('app01/menu/', views.menu),
]

app01的views.py

装饰器login_required的作用是只有登录的用户才能调用该函数

from django.shortcuts import render, HttpResponse
from django.contrib import auth
from django.contrib.auth.decorators import login_required# Create your views here.def login(request):if request.method == 'POST':# 1.获取前端输入的用户名密码username2 = request.POST.get('username1')password2 = request.POST.get('password1')# 2.将前端获取到用户名密码与auth表中的数据比对# 3.表中是密文,需要导入auth模块校验from django.contrib import authuser_obj = auth.authenticate(username=username2, password=password2)if user_obj:# 4.保存用户登录状态,自动操作session
            auth.login(request, user_obj)return render(request, 'login.html')def check_login(request):# user为系统自带:点击查看class AuthenticationMiddlewareprint(request.user)return HttpResponse('查看当前用户是否已经登录')@login_required
def index(request):return HttpResponse('index页面,只有登录的用户才可以看到')@login_required
def home(request):return HttpResponse('home页面,只有登录的用户才可以看到')@login_required
def menu(request):return HttpResponse('menu页面,只有登录的用户才可以看到')

未登录时,无法访问login_required修饰过的页面

image

login_required实现未登录时指定的跳转页面

局部配置,只对这个函数有作用

@login_required(login_url='/app01/login/')  # 未登录时跳转到login页面  
def index(request):return HttpResponse('index页面,只有登录的用户才可以看到')

image

(2) 全局配置登录后才能访问的页面

在 settings.py中添加
  LOGIN_URL = '/app01/login/'

views.py中所有被login_required修饰的函数,在未登录时,被调用都会跳转到LOGIN_URL = '/app01/login/'

[5] 修改密码

项目的urls.py

urlpatterns = [path('admin/', admin.site.urls),path('app01/login/', views.login),path('app01/modify_pwd/', views.modify_pwd),
]

app01的views.py

from django.shortcuts import render, HttpResponse
from django.contrib import auth
from django.contrib.auth.decorators import login_required# Create your views here.def login(request):if request.method == 'POST':# 1.获取前端输入的用户名密码username2 = request.POST.get('username1')password2 = request.POST.get('password1')# 2.将前端获取到用户名密码与auth表中的数据比对# 3.表中是密文,需要导入auth模块校验from django.contrib import authuser_obj = auth.authenticate(username=username2, password=password2)if user_obj:# 4.保存用户登录状态,自动操作session
            auth.login(request, user_obj)return HttpResponse('登录成功')return render(request, 'login.html')@login_required
def modify_pwd(request):if request.method == 'POST':# 1.获取前端输入的原密码与新密码before_pwd1 = request.POST.get('before_pwd')new_pwd1 = request.POST.get('new_pwd')res = request.user.check_password(before_pwd1)  # 2.比对原密码是否正确if res:request.user.set_password(new_pwd1)  # 3.修改密码request.user.save()  # 4.保存数据到数据库中return render(request, 'modify.html', locals())

app01的modify.html

<body>
<form action="" method="post">{% csrf_token %}<P>用户名:{{ request.user.username }}</P><p>原密码:<input type="text" name="before_pwd"></p><p>新密码:<input type="text" name="new_pwd"></p><input type="submit">
</form>
</body>

登录

image

image

修改密码

image

使用新密码登录

image

image

[6] 注销

项目的urls.py

urlpatterns = [path('admin/', admin.site.urls),path('app01/login/', views.login),path('app01/logout/', views.logout),
]

app01的views.py

from django.shortcuts import render, HttpResponse
from django.contrib import auth
from django.contrib.auth.decorators import login_required# Create your views here.def login(request):if request.method == 'POST':# 1.获取前端输入的用户名密码username2 = request.POST.get('username1')password2 = request.POST.get('password1')# 2.将前端获取到用户名密码与auth表中的数据比对# 3.表中是密文,需要导入auth模块校验from django.contrib import authuser_obj = auth.authenticate(username=username2, password=password2)if user_obj:# 4.保存用户登录状态,自动操作session
            auth.login(request, user_obj)return HttpResponse('登录成功')return render(request, 'login.html')@login_required
def logout(request):auth.logout(request)return HttpResponse('注销')

登录

image

 登录成功django_session表有3条记录

image

注销之后django_session表只有2条记录

image

image

[7] 注册

项目的urls.py

urlpatterns = [path('admin/', admin.site.urls),path('app01/login/', views.login),path('app01/register/', views.register),
]

app01的views.py

from django.contrib import auth
from django.contrib.auth.models import User# Create your views here.def register(request):User.objects.create(username='kylian', password='666')return HttpResponse('注册功能')

访问路由调用注册函数

image

密码没有加密

image

User.objects.create_user和User.objects.create_superuser会对密码进行加密

3.4 扩展auth_user表

[1] 方式一:一对一(了解)

应用的models.py中

from django.db import models
from django.contrib.auth.models import User, AbstractUser# Create your models here.
class UserDetail(models.Model):phone = models.CharField(max_length=32)user = models.OneToOneField(to='User', on_delete=models.CASCADE)

[2] 方式二:类继承(推荐)

如果继承了AbstractUser,在运行数据库迁移命令的时候,auth_user表就不会被创建,而自定义的表会在auth_user表的基础上添加自定义扩展的字段

应用的models.py中

from django.db import models# Create your models here.from django.contrib.auth.models import AbstractUserclass UserInfo(AbstractUser):phone = models.CharField(max_length=11)addr = models.CharField(max_length=32)

需要在settings.py中增加配置,作用是不再使用auth_user表,而是使用自定义的表

AUTH_USER_MODEL = 'app01.UserInfo'     #  '应用名.新的表名'

 

使用该方法的前提:

1.settings.py中配置的目标数据库没有使用迁移命令进行迁移(即auth_user 表没有被创建)

2.如果有迁移过,建立一个新的库、更改settings.py的配置

3.自定义的表里面不要覆盖 AbstractUser 里面的字段名,只需扩展额外的字段即可

4.auth模块所有的方法都可以直接在自定义模型类上使用,参考的表自动从auth_user切换到自定义表

使用类继承方法前数据库的表:

image

使用类继承方法后数据库的表:

image

自定义的表在auth_user的基础上新增的字段

image

 

相关新闻

  • 2026新桥街道专业的空调加氟公司推荐排行 - 品牌排行榜
  • 2026上海网站建设公司排名:十大官网定制服务商参考 - IT老炮老刘
  • ARM GCC+CMake构建MQX RTOS开发环境:从零搭建到Kinetis K64调试实战

最新新闻

  • 【LLM系列】深入拆解投机解码:大模型推理提速3-5倍的核心技术,从原理到生产全解析
  • 一块好电木板能用十年,浙江亚格电子品质靠谱质量好,品牌推荐排名靠前厂家推荐首选 - 品牌速递
  • 亨得利官方名表服务中心|网点地址与售后服务热线权威信息通告(2026年7月更新) - 亨得利官方博客
  • etipc性能调优:提升Linux内核模块通信效率的完整指南
  • 奢侈品稀缺度定价算法,根据限量数量计算单品合理溢价区间平衡销量与档次。
  • 浙江亚格电子电木板:客户至上服务理念践行,质量稳定获一致好评 - 品牌速递

日新闻

  • OpenClaw本地部署:一键直连微信的私有化AI Agent实战指南
  • Kubernetes 系列【10】控制器:ReplicaSet(副本集)
  • 怎么寄快递才能便宜呢?2026年7月寄快递省钱攻略 - 生活情报姬

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号