ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

django_sttings配置_RBAC_django-debug-toolbar模块

2022-06-03 16:31:59  阅读:140  来源: 互联网

标签:__ sttings name 配置文件 settings url 用户 django RBAC


目录

一.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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有