django配置文件相关 权限管理 admin配置类参数
django配置相关操作
1.django其实有两个配置文件
一个是保露给可以自定义的基本配置
from 项目名 import settings
一个是全局的系统默认配置(用户不指定的情况 采用的配置)
from django.conf import global_settings
2.用户如果在暴露给用户的配置文件中指定了配置,则使用用户的,不指定则又会使用系统默认的
#思考:如何实现上述操作(两个配置文件相互兼容)
'''
测试配置文件的兼容性:
django系统默认支持很多国家的语言 只需修改配置即可
LANGUAGE_CODE = 'en-us'
系统配置文件中还提供了很多其他语言配置
'''
3.暴露给用户的配置文件中有的配置 系统配置文件中肯定有
暴露给用户的配置文件中没有的配置 系统配置文件中也有
4.我们在django中如果想要使用配置文件 那么最正确的导入方式
from django.cong import settings
django配置文件源码
1.os.environ 可以看成是一个项目全局的大字典 任何地方都可以使用
2.django的入口文件是manage.py(也可以看成是启动文件)
3.os.environ.setdefault() 相当于给字典添加键值对
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day62_BBS.settings")
from django.conf import settings
class Settings(object):
def __init__(self, settings_module):
# 获取系统配置文件中所有的变量名
for setting in dir(global_settings):
if setting.isupper(): # 校验变量名是否是纯大写(这就是为什么配置文件中的配置必须大写才能生效的原因)
setattr(self, setting, getattr(global_settings, setting))
'''通过反射获取系统配置文件中所有的大写变量名和对应的值 赋值给settings对象'''
self.SETTINGS_MODULE = settings_module
mod = importlib.import_module(self.SETTINGS_MODULE)
"""rom day62_BBS import settings """
# 循环获取暴露给用户的配置文件中所有的变量名
for setting in dir(mod):
if setting.isupper(): # 判断是否是纯大写
setting_value = getattr(mod, setting)
setattr(self, setting, setting_value) # 给对象设置属性
class LazySettings(LazyObject):
def _setup(self, name=None):
# 获取暴露给用户的配置文件字符串路径 'day62_BBS.settings'
settings_module = os.environ.get(ENVIRONMENT_VARIABLE)
# 将上述字符串路径当做参数传给Settings类实例化
self._wrapped = Settings(settings_module)
settings = LazySettings()
权限管理简介
# web领域的权限
eg:
使用账号访问某个资源 有些人可以访问(VIP) 有些人不能访问(普通用户)
ps:在web领域url其实就是权限 权限就是url
"""本质其实就是当用户登录之后 获取该用户的权限 之后每次用户发送网络请求先核对该请求地址是否在用户可以访问的url列表内 如果在则访问不在拒绝"""
RBAC
# 基于角色的权限管理
用户表
id name pwd
1 jason 123
2 tony 321
3 kevin 222
角色表
id role
1 CEO
2 保安
3 扫地僧
权限表
id permission url
1 添加书籍 /add/book/
2 查看书籍 /check/book/
3 编辑书籍 /edit/book/
4 删除书籍 /delete/book/
用户角色关系表
id user_id role_id
1 1 1
2 2 2
角色权限关系表
id role_id permission_id
1 1 1
2 1 2
3 1 3
4 1 4
"""
提前在角色和权限关系表中绑定好关系 之后又新用户
只有在用户和角色关系表中添加一两条数据即可!!!
"""
权限管理实战
# url权限也不是固定写死的 含有正则表达式
eg:
/edit/book/1/ /edit/book/(\d+)/
/edit/book/?edit_id=1 /edit/book/.*
1.编写登陆功能 获取用户的权限并存储
2.校验每次用户访问的url比对是否含有该权限
自定义中间件
3.有些权限是所有用户都应该具备的
白名单:里面的东西所有人都可以访问
4.有些url是含有正则的 不能简单的使用成员运算来判断
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
import re
class MyPermission(MiddlewareMixin):
def process_request(self, request):
# 定义网站白名单
white_url_list = ['/login/', '/register/', '/admin/.*']
# 1.获取当前用户请求的url
target_url = request.path
# 1.1.先校验是否在白名单中 是则直接放行
for url in white_url_list:
re_path = '^%s$' % url # 将白名单里面的url变成正则表达式 去校验用户访问的url
res = re.search(re_path, target_url)
if res:
return
# 2.获取当前用户的权限列表
permission_list = request.session.get('permission_list')
# 3.判断当前请求url在不在用户可以访问的url列表中
'''也需要改成正则校验的方式'''
# if target_url not in permission_list:
# return HttpResponse("不好意思 你没有权限访问")
for permission in permission_list:
re_path = '^%s$' % permission
res = re.search(re_path, target_url)
if res:
return
return HttpResponse("你没有权限 滚蛋吧!!!")
"""
扩展延伸
1.黑名单
2.用户的访问频率
获取用户的ip地址 然后设置固定的时间内访问次数不能超过多少次
...
其实上述的功能我们可以自己写 也有一些有现成的组件帮我们完成
drf相关功能
"""
admin配置参数
class BookConfig(admin.ModelAdmin):
list_display = ['title', 'price', 'publish_time'] # 控制展示的字段数量
list_display_links = ['price'] # 指定调整的字段数据
search_fields = ['title', 'price'] # 包含+或 查找
# 回想之前讲解的Q查询进阶用法
list_filter = ['publish','authors'] # 筛选功能 一般填写外键字段 普通字段没有实际意义
def patch_init(self,request,queryset):
queryset.update(price = F('price') + 1000)
patch_init.short_description = '价格批量处理'
actions = [patch_init, ] # 自定义queryset的操作函数
admin.site.register(models.Book, BookConfig)
# admin还有很多其他的功能配置 可以简单参考
https://www.cnblogs.com/Dominic-Ji/p/10444379.html
第三方bug检测功能
# django-debug-toolbar
是一组可配置的面板,可显示有关当前请求/响应的各种调试信息,并在单击时显示有关面板内容的更多详细信息。
# 安装
pip3 install django-debug-toolbar
# 配置
# settings.py中的配置
INSTALLED_APPS = [
…
'debug_toolbar',
]
MIDDLEWARE = [
# ...
'debug_toolbar.middleware.DebugToolbarMiddleware',
# ...
]
# urls.py
from django.conf import settings
from django.conf.urls import include, url
if settings.DEBUG:
import debug_toolbar
urlpatterns = [
url(r'^__debug__/', include(debug_toolbar.urls)),
] + urlpatterns
# 参考博客:https://www.cnblogs.com/Dominic-Ji/p/9260182.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)