1. 程式人生 > 其它 >django配置檔案與admin相關內容

django配置檔案與admin相關內容

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

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

3. 基於setting原始碼程式設計

"""在自己的專案中實現與django配置檔案一樣的功能"""
模擬一個暴露給使用者的配置檔案
conf
    --settings.py
模擬一個系統內部預設配置檔案
lib
    --conf
      ----global_settings.py

4. 許可權管理簡介

# web領域的許可權
  在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
  """上述的許可權設計是存在缺陷的 使用者資料多了之後與許可權的繫結關係在第三張關係表中過於繁雜"""

5. 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
  """
  提前在角色和許可權關係表中繫結好關係 之後又新使用者 
  只有在使用者和角色關係表中新增一兩條資料即可!!!
  """

6. 許可權管理實戰

# url許可權也不是固定寫死的 可能會含有正則表示式
    eg:  
        /edit/book/1/                    /edit/book/(\d+)/
        /edit/book/?edit_id=1            /edit/book/.*
1.編寫登陸功能 獲取使用者的許可權並存儲
2.校驗每次使用者訪問的url比對是否含有該許可權
    自定義中介軟體
3.有些許可權是所有使用者都應該具備的
    白名單:裡面的東西所有人都可以訪問
4.有些url是含有正則的 不能簡單的使用成員運算來判斷

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