其他分享
首页 > 其他分享> > django_sttings配置_RBAC_django-debug-toolbar模块

django_sttings配置_RBAC_django-debug-toolbar模块

作者:互联网

目录

一.django配置文件操作

# django其实是有两个配置文件
1.暴漏给用户自定义的基本配置
django项目内的自带settings文件
调用:
from 项目名 import sttings

2.全局系统默认的配置文件在(用户不指定的情况下 默认的配置)
from django.conf imporf global_settings
# golbal_settings
3.用户如在给暴漏给用户的配置文件中指定了配置则使用用户的配置文件  
如不指定则使用系统默认的配置文件
4.暴漏给用户的配置,在系统配置文件中肯定也有
'用户配置文件 没有的 系统配置文件有,有的系统配置文件中也有看是否指定'
5.如想在django中想要使用到系统配置文件则
from django.conf import settings # 封装好的

二.djanog配置文件源码分析

settings = LazySettings()       # 本身是序列化的对象
class LazySettings(LazyObject):  # 继承了一个类
    def _setup(self, name=None): 
        settings_module = os.environ.get(ENVIRONMENT_VARIABLE)
        # os.environ 是全局字典.get获取到ENVIRONMENT_VARIABLE字典内暴露给用户自定义的配置文件路径
        settings_module
        # django的入口文件是manage.py(也可以看成是启动文件)
	 self._wrapped = Settings(settings_module)
    # 将settings_module当参数传入Settings类实例化对象

class Settings(object):
     def __init__(self, settings_module):  
             for setting in dir(global_settings):  
                    # global_settings系统配置文件
                    # 获取系统文件中所有的变量名for循环只能获取到字典的K
                 if setting.isupper():
                    # 校验变量名是否为纯大写 配置文件中的配置必须为大写
                     setattr(self, setting, getattr(global_settings, setting))
                    # getattr反射通过setting获取全局global_settings里面的值
                    # setattr反射对象setting,设置键 将括号内的值赋予给setting对象
                    self.SETTINGS_MODULE = settings_module 
                    mod = importlib.import_module(self.SETTINGS_MODULE)
                    # 通过字符串路径导入模块 mod 目前就是暴漏给用户的的配置文件
                    for setting in dir(mod):
                        # 循环暴漏给用户的配置文件 K
                        if setting.isupper():
                            #  判断是否为大写
                             setting_value = getattr(mod, setting)
                                # 利用反射获取纯大写变量名的值
                                 setattr(self, setting, setting_value)          # 给对象从新获取新的属性
    		

# manage.py内
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangoProject520.settings")
# setdefault给字典添加键值对 值是django暴露给用户自定义的配置文件路径

三.基于setting源码流程

"""
模拟setting源码流程
模拟出两个django配置文件
"""
# 用户配置文件
conf
settings.py
NAME = '模拟暴露给用户自定义的配置的name'

# 全局配置文件
conf1
golbal_settings.py  
NAME = '模拟全局的配置的name'

__init__.py

import importlib
import os
from lib.conf import global_settings
class Settings(object):
    def __init__(self):
        # 循环获取全局配置文件中的名字
        for name in dir(global_settings):
            # 判断全局变量中的名字是否为全大写
            if name.isupper():
                # 根绝大写字母获取对应的值
                value = getattr(global_settings,name)
                # 给对象设置键值对
                setattr(self,name,value)
        # 获取暴漏给用户的自定义配置文件字符串路径   全局变量中取出qwe的值
        module_path_str = os.environ.get('qwe')
        # 根据字符串导入路径
        module_name = importlib.import_module(module_path_str)
        # 循环获取暴漏给用户配置文件中的所有名字
        for name in dir(module_name):
            if name.isupper():
                value = getattr(module_name,name)
                setattr(self,name,value)


settings = Settings()
# 启动脚本文件
start.py
import os
import sys

sys.path.append(os.path.dirname(__file__))


if __name__ == '__main__':
    # 在全局字典内添加
    os.environ['qwe'] = 'conf.settings'
    from lib.conf import settings
    print(settings.NAME)
# 文件夹名字如何获取 __init__ 包

四.权限管理

# web领域的权限

我们在登陆某些网站时,常常会出现你不是VIP用户
其实就是web领域的 url 权限 权限就是url

"""
用户有用户的权限
VIP有用户的权限及VIP权限
每次访问url 就是效验你的账户是否在url列表内 如没有就是普通用户
"""

1.1权限表设计

# 1.用户表
id       name      age
1        thn        28
2        jason      18
3        ppd        26

# 2.权限表
id         permission
1            添加员工
2            清除员工 
3            编辑信息
4            删除信息

# 多对多关系表
id           user_id          permission
1             1                   1
2             2                   2
3             3                   4  
"""
但是这样写 如果出现很多拥有权限的用户那么
关系表 会出现 屎山关系
"""

五.RBAC

1.RBAC基于给用户表加装一层表的对应信息
# 1.用户表
id       name      age
1        thn        28
2        jason      18
3        ppd        26

# 加装的对应信息表  和用户表可以是一对多 或多对多关系
# 2.角色表

id       role
1        员工
2        组长
3        老板

# 3.权限表
id           permission        url   
1            添加员工         /add/staff/
2            清除员工         /check/staff/
3            编辑信息         /edit/staff/
4            删除信息         /delete/staff/

# 4. 用户角色关系表
id            user_id         per1mission_id
1               1                  1
2               2                  2
3               3                  4

# 5.角色权限关系表
id		       role_id		   permission_id
1                 1                  3    
2                 2                  1
3                 3                  4
"""
  提前在角色和权限关系表中绑定好关系 之后又新用户 
  只有在用户和角色关系表中添加一两条数据就好
"""

六.权限管理应用

# 将表关系创建出来后,的操作
1.编写登陆功能
def login(request):
    # 获取用户输入信息
    if request.method == 'POST':
        name = request.POST.get('username')
        pwd = request.POST.get('password')
        # 效验用户存在
        user_obj =              models.User.objects.filter(name=name,pwd=int(pwd)).first()
        if user_obj:                  # 转整型密码
            # 获取url权限 
            username_obj = models.User.objects.filter(name=name,pwd=int(pwd)).values('role__username__url').distinct() # 去重重复权限
            username_obj = [i.get('role__username__url')for i in username_obj]  # 列表生成式  保存到session内 
            request.session['username_obj'] = username_obj
    return render(request,'login.html')
2.将用户角色权限表注册到admin中
from django.contrib import admin

# Register your models here.
from app01 import models

admin.site.register(models.User)
admin.site.register(models.Role)
admin.site.register(models.Username)  # 权限表....
3.手动创建中间件进行拦截判断
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
import re   # 正则使用方便


class MyUser(MiddlewareMixin):
    def process_request(self,request):
        # 白名单
        url_list = ['/login/','/admin/.*']
        # 获取用户请求的url 携带的路径信息
        target_url = request.path
        # 校验用户的url 是否存在
        for url in url_list:
            # 将白名单里的url 变为正则表达式 校验用户访问的URl
            re_url = '^%s' % url
            res = re.search(re_url,target_url)
            if res:
                return
            # 获取当前用户的权限
        username_obj = request.session.get('username_obj')
        # 判断当前用户 请求的url 是可以访问url 白单列表内的数据
        # 也要修改为正则表达式的形式
        for i in username_obj:
            re_url = '^%s' % i
            res = re.search(re_url,target_url)
            if res:
                return
            return HttpResponse('抱歉你没有权限')

4.注册中间键
MIDDLEWARE = ['app01.permissions.my_permission.MyUser']
# permissions手写中间件文件名my_permission中间件py文件MyUser类

5.记得在路由层添加对应关系
6.通过admin中创建的用户 与其对应关系 通过中间件
判断是否拥有权限,白名单内是任何用户都可以访问的权限
'admin/.*如果访问请求带有后缀也可以访问'
如果添加黑名单,需额外创建黑名单列表从新写判断

七.admin配置参数

class Bo(admin.ModelAdmin):
    list_display = ['name','pwd']    # 展示更多字段
    list_display_links = ['pwd']     # 控制指定跳转的字段数据
    search_fields = ['pwd']          # 搜索框查找Q 查找
    list_filter = ['role']           # 填写外界字段筛选栏
    
    
    def patch_init(self,request,queryset):
        queryset.udate(price = F('price') + 1000)
    patch_init.short_description = '价格批量处理'
    actions = [patch_init, ]         # 自定义queryset的操作函数
   
admin.site.register(models.User,Bo)  # 注册时加入类名一起注册

八.第三方BUG检测

1.pip3 install django-debug-toolbar # 制定好版本在下载
2.INSTALLED_APPS = [ 'debug_toolbar',]   # settings.py

3.from django.conf import settings
if settings.DEBUG:
    import debug_toolbar
    urlpatterns = [
        url(r'^__debug__/', include(debug_toolbar.urls)),
    ] + urlpatterns
    # url 路由层下方 导入settings模块
    
4.MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware',]
# 中间件文件中加入
5.INTERNAL_IPS = ['127.0.0.1', ]   # 加入本机调试

6.设置jQuery的URL,默认谷歌地址
JQUERY_URL = '//ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js'

7.如国内使用不了
"""
DEBUG_TOOLBAR_CONFIG = {
    "JQUERY_URL": '//cdn.bootcss.com/jquery/2.2.4/jquery.min.js',
}
"""
8.Django项目中使用了jquery
"""
DEBUG_TOOLBAR_CONFIG = {
    "JQUERY_URL": '',
}
"""

标签:__,sttings,name,配置文件,settings,url,用户,django,RBAC
来源: https://www.cnblogs.com/xwkg/p/16340116.html