1. 程式人生 > 其它 >django配置檔案相關操作,基於setting原始碼程式設計,許可權管理

django配置檔案相關操作,基於setting原始碼程式設計,許可權管理

django配置檔案相關操作

1.django其實有兩個配置檔案
	一個是暴露給使用者可以自定義的基本配置
  	from 專案名 import settings
  一個是全域性的系統預設的配置(使用者不指定的情況 採用的配置)
  	from django.conf import global_settings
2.使用者如果在暴露給使用者的配置檔案中指定了配置則使用使用者的 不指定則又會使用系統預設的
	# 思考:如何實現上述操作(兩個配置檔案相互相容)  一會兒需要看原始碼
  """測試配置檔案的相容性
  其實django系統預設支援很多國家的語言 只需要修改配置即可
  	LANGUAGE_CODE = 'en-us'
  系統配置檔案中還提供了很多其他語言配置
  """
3.暴露給使用者的配置檔案中有的配置 系統配置檔案中肯定有
	暴露給使用者的配置檔案中沒有的配置 系統配置檔案中也有
4.我們在django中如果想要使用配置檔案 那麼最正確的匯入方式
	from django.conf import settings
  # 思考:上述的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原始碼程式設計

"""在自己的專案中實現與django配置檔案一樣的功能"""
模擬一個暴露給使用者的配置檔案
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

第三方bug檢測功能

pip3 install django-debug-toolbar
# 參考部落格:https://www.cnblogs.com/Dominic-Ji/p/9260182.html