栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

逆袭之路——python django配置文件相关操作、基于角色的权限管理(RBAC)、admin源码及路由分发本质【day67】

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

逆袭之路——python django配置文件相关操作、基于角色的权限管理(RBAC)、admin源码及路由分发本质【day67】

今日内容概要
  • django配置文件相关操作
  • 基于django配置文件源码编写代码
  • 权限管理简介
  • 基于角色的权限管理(RBAC)
  • admin配置类重要参数
  • admin源码及路由分发本质
今日内容详细 一、django配置文件相关操作
  1. django其实有两个配置文件
		一个是暴露给用户可以自定义的基本配置
	  	from 项目名 import settings
	  一个是全局的系统默认的配置(用户不指定的情况 采用的配置)
	  	from django.conf import global_settings
  1. 用户如果在暴露给用户的配置文件中指定了配置则使用用户的 不指定则又会使用系统默认的
		# 思考:如何实现上述操作(两个配置文件相互兼容)  一会儿需要看源码
	  """测试配置文件的兼容性
	  其实django系统默认支持很多国家的语言 只需要修改配置即可
	  	LANGUAGE_CODE = 'en-us'
	  系统配置文件中还提供了很多其他语言配置
	  """
  1. 暴露给用户的配置文件中有的配置 系统配置文件中肯定有
		暴露给用户的配置文件中没有的配置 系统配置文件中也有
  1. 我们在django中如果想要使用配置文件 那么最正确的导入方式
		from django.conf 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()
三、基于setting源码编程
	模拟一个暴露给用户的配置文件
	conf
		--settings.py
	模拟一个系统内部默认配置文件
	lib
		--conf
	  	----global_settings.py
四、权限管理简介
	# web领域的权限
		eg:
	    使用账号访问某个资源 有些人可以访问(VIP) 有些人不能访问(普通用户)
	  ps:在web领域url其实就是权限 权限就是url
	  """本质其实就是当用户登录之后 获取该用户的权限 之后每次用户发送网络请求先核对该请求地址是否在用户可以访问的url列表内 如果在则访问不在拒绝"""
	
	# 权限的设计
		用户表
	  	id 		name			pwd
	    1			jason			123
	    2			tony			321
	    3			kevin			222
	  权限表
	  	id		permission	
	    1				添加书籍
	    2				查看书籍
	    3				编辑书籍
	    4				删除书籍
	  用户与权限的关系表
	  	id		user_id			permission_id
	    1				1						1
	    2				1						2	
	    3				1						3
	  """上述的权限设计是存在缺陷的 用户数据多了之后与权限的绑定关系在第三张关系表中过于繁杂"""
五、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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/953557.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号