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
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相关功能 """
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
# 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