1、django有两个配置文件
一个是给用户定义的基本配置
from 项目名称 import settings
还有一个就是全局的系统默认的配置(就是当用户不在settings里面指定的情况下, 采取里面的配置)
from django.conf import global_seetungs
2、用户如果在给用户定义的配置文件中指定了配置,那么系统就是使用用户定义的,不指定则使用系统的默认的
"""测试配置文件的兼容性
其实django系统默认支持很多国家的语言 只需要修改配置即可
LANGUAGE_CODE = 'en-us'
系统配置文件中还提供了很多其他语言配置
"""
os.environ 可以看成一个项目的全局的大字典,任何地方都可以使用
django的入口文件是manage.py, 可以看成是启动文件
os.environ.setdefault() 相当于给字典添加键值对
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "bbs_1.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 "bbs_1 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()
可以自己模拟一个和django配置文件一样的功能
模拟一个给用户自定义的配置文件
conf
settings.py
# NAME = '我是自定义配置文件的name'
# 模拟一个系统内部默认的配置文件
lib
conf
global_settings.py
# conf
class Settings(object):
def __init__(self):
for name in dir(global_settings):
# 判断是否纯大写
if name.isupper():
# 根据大写的名字获取值
value = getattr(global_settings, name)
setattr(self, name, value)
# 获取给用户自定义的配置文件字符串路径
module_path = os.environ.get('lll')
# 根据字符串导入模块
module_path = importlib.import_module((module_path))
# 循环获取嘿用户自定义配置文件中的所有名字
for name in dir(module_path):
if name.isupper():
value = getattr(module_path, name)
setattr(self, name, value)
settings = Settings()
# global_settings.py
NAME = '系统内部默认的配置NAME'
AGE = '系统内部默认的配置AGE'
pwd = '系统默认的配置pwd'
# web领域的权限
使用账号访问某个资源 VIP可以访问, 普通用户不能访问
ps:在web领域url其实就是权限 权限就是url
"""本质其实就是当用户登录之后 获取该用户的权限 之后每次用户发送网络请求先核对该请求地址是否在用户可以访问的url列表内 如果在则访问不在拒绝"""
# 权限的设计
用户表
权限表
用户与权限的关系表
# 设计缺陷就是用户数据多了之后,与权限的绑定关系在第三张关系表中过去繁杂
# 基于角色的权限管理
用户表
角色表
权限表
用户角色关系表
角色权限关系表
# 给角色和权限绑定好关系, 之后我们在添加新用户时,只需要在角色和角色关系表中添加数据就好了
'''url权限也不是固定写死的 可能会含有正则表达式'''
/edit/book/1/ /edit/book/(\d+)/
/edit/book/?edit_id=1
/edit/book/.*
1.编写登陆功能 获取用户的权限并存储
2.校验每次用户访问的url比对是否含有该权限
自定义中间件
3.有些权限是所有用户都应该具备的
白名单:里面的东西所有人都可以访问
4.有些url是含有正则的 不能简单的使用成员运算来判断
"""
扩展延伸
1.黑名单
2.用户的访问频率
获取用户的ip地址 然后设置固定的时间内访问次数不能超过多少次
drf相关功能
"""
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("干神魔干神魔,你也配进去")
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
pip3 install django-debug-toolbar
# 参考博客:https://www.cnblogs.com/Dominic-Ji/p/9260182.html