Django结尾知识

1 > Django配置文件相关操做

1.1 > django的两个配置文件

   一个是暴露给用户可以自定义的基本配置。


	from 项目名 import settings

   一个是全局的系统默认的配置(用户不指定的情况 采用的配置)


	from django.conf import global_settings

   用户如果在暴露给用户的配置文件中指定了配置则使用用户的 不指定则又会使用系统默认的。


	测试配置文件的兼容性
		其实django系统默认支持很多国家的语言 只需要修改配置即可
		LANGUGE_CODE = 'en-us'
		系统配置文件还提供了很多其他语言配置

   暴露给用户的配置文件中有的配置 系统配置文件中肯定有。
   暴露给用户的配置文件中没有的配置 系统配置文件中也有。
在这里插入图片描述
   我们在django中如果想要使用配置文件 那么最正确的导入方式是以下方式。


	from django.conf import settings

1.2 > django配置文件源码

   我们点击settings查看源码发现,以下情况
在这里插入图片描述
  点击LazySettings类查看源码发现:

1.2.1 > os.environ 可以看成是一个项目全局的大字典 任何地方都可以使用

   在字典当中想要拿到ENVIRONMENT_VARIABLE键所对应的值"DJANGO_SETTINGS_MODULE"

在这里插入图片描述

1.2.2 > django的入口文件是manage.py(也可以看成是启动文件)


	os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Blog_System.settings")
	# 相当于给这个大字典添加键值对
	Blog_System.settings 其实就是django自定义暴露给用户的配置文件路径

在这里插入图片描述


	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()


	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)  # 给对象设置属性

1.3 > 基于setting源码编程


	"""在自己的项目中实现与django配置文件一样的功能"""
	模拟一个暴露给用户的配置文件
	conf
		--settings.py
	模拟一个系统内部默认配置文件
	lib
		--conf
	  	----global_settings.py

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 > 权限管理简介

2.1 > web领域的权限

   本质其实就是当用户登录之后 获取该用户的权限
   之后每次用户发送网络请求先核对该请求地址是否在用户可以访问的url列表内
   如果在则访问不在拒绝

2.2 > 权限的设计

   方式一:


用户表
  	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

2.3 > 权限管理实战

   具体步骤如下:


# 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("你没有权限 滚蛋吧!!!")

3 > 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

4 > 第三方bug检测功能


	pip3 install django-debug-toolbar
	# 参考博客:https://www.cnblogs.com/Dominic-Ji/p/9260182.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值