Django之靜態檔案,中介軟體,admin後臺管理
靜態檔案
靜態檔案的使用
在 網頁使用的css檔案,js檔案和圖片等叫做靜態檔案。
1)在專案下新建靜態資料夾 static。
2) 配置靜態檔案所在的物理目錄。Settings.py
- STATIC_URL設定訪問靜態檔案對應的url。
- STATICFILES_DIRS設定靜態檔案所在的物理目錄。
動態生成靜態檔案的路徑
即不管你的 STATIC_URL 怎麼變,也對頁面上的靜態檔案url獲取沒影響
settings.py
# 設定訪問靜態檔案的url地址 # http://127.0.0.1:8000/static/images/mm.jpg,通過這個,可以直接訪問圖片 STATIC_URL = '/static/' # STATIC_URL = '/abc/' # 設定靜態檔案存放的物理目錄 # Django找靜態檔案的順序:先去配置的 STATICFILES_DIRS 下面去找,找不到就去應用下面的static下面找 STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
static_test.html
<!DOCTYPE html> {% load staticfiles %} <html lang="en"> <head> <meta charset="UTF-8"> <title>靜態檔案測試</title> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <img src="/static/images/mm.jpg" alt="mm"> <img src="/abc/images/mm.jpg" alt="mm"> 動態獲取 STATIC_URL,拼接靜態檔案路徑:<br> <img src="{% static 'images/mm.jpg' %}" alt="mm"> </body> </html>
配套函式
def static_test(request): """靜態檔案""" return render(request, 'booktest/static_test.html')
中介軟體
中介軟體函式是django框架給我們預留的函式介面,讓我們可以干預請求和應答的過程。
使用中介軟體
1)在應用中新建middleware.py檔案。
2)定義中介軟體類。
在類中定義中介軟體預留函式。
- __init__:伺服器響應第一個請求的時候呼叫。
- process_request:是在產生request物件,進行url匹配之前呼叫。
- process_view:是url匹配之後,呼叫檢視函式之前。
- process_response:檢視函式呼叫之後,內容返回給瀏覽器之前。
- process_exception:檢視函數出現異常,會呼叫這個函式。
如果註冊的多箇中間件類中包含process_exception函式的時候,呼叫的順序跟註冊的順序是相反的。
3)註冊中介軟體類。
使用中介軟體進行登入判斷案例
獲取瀏覽器端的ip地址,使用request物件的META屬性:
request.META['REMOTE_ADDR']
需求
當我們需要禁用某些惡意ip的訪問時,需要獲取使用者ip,然後建立一個禁止ip列表,判斷ip是否在禁止列表中,如果是惡意ip,則禁止進入,
否則返回響應的頁面,誠然,我們可以定義一個裝飾器來對每個函式進行判斷,但這並不是最佳的選擇,我們可以使用中介軟體。
單個函式判斷
def index(request): """首頁""" user_ip = request.META['REMOTE_ADDR'] print(user_ip) if user_ip in EXCLUDE_IPS: return HttpResponse("<h2>Forbidden</h2>") return render(request, 'booktest/index.html')
裝飾器判斷
def ban_ip(view_func): """用來禁止惡意ip的裝飾器""" def wrapper(request, *args, **kwargs): user_ip = request.META['REMOTE_ADDR'] print(user_ip) if user_ip in EXCLUDE_IPS: return HttpResponse("<h2>Forbidden</h2>") else: return view_func(request, *args, **kwargs) return wrapper @ban_ip def index(request): """首頁""" return render(request, 'booktest/index.html')
中介軟體步驟
- 1.在應用下新建一個middleware.py檔案,名字隨意,但一般用這個。
- 2.編寫中介軟體程式碼;
- 3.在settings中註冊中介軟體;
中介軟體判斷
from django.utils.deprecation import MiddlewareMixin from django.http import HttpResponse class BanIpMiddleware(MiddlewareMixin): """中介軟體類""" EXCLUDE_IPS = ['127.0.0.1'] @staticmethod def process_view(request, view_func, *args, **kwargs): """檢視函式呼叫之前會呼叫""" user_ip = request.META['REMOTE_ADDR'] if user_ip in BanIpMiddleware.EXCLUDE_IPS: return HttpResponse("<h2>Forbidden</h2>")
註冊中介軟體
MIDDLEWARE = [ 'booktest.middleware.BanIpMiddleware', ]
中介軟體執行順序
中介軟體的執行順序一般是按照在settings檔案裡面的註冊順序來的,特殊情況是如果註冊的多箇中間件類中包含process_exception函式的時候,呼叫的順序跟註冊的順序是相反的。
__init__只在伺服器重啟之後,第一個請求時呼叫,後面的請求都不會再呼叫了;
中介軟體執行順序示例程式碼
class TestMiddleware(MiddlewareMixin): """中介軟體類""" def __init__(self, get_response=None): """伺服器重啟之後,接收第一個請求時呼叫""" # get_response引數是必需的,這個引數指的是下一個中介軟體或者view函式(如果是最後一箇中間件)。 super().__init__() self.get_response = get_response print("-----init-----") @staticmethod def process_request(request): """產生request物件之後,url匹配之前呼叫""" print("-----process_request-----") @staticmethod def process_view(request, view_func, *args, **kwargs): """url匹配之後,檢視函式呼叫之前呼叫""" print("-----process_view-----") @staticmethod def process_response(request, response): """檢視函式之後,應答返回瀏覽器之前""" print("-----process_response-----") return response # 執行結果: # -----init----- # -----process_request----- # -----process_view----- # -----process_response----- class ExceptionTest1Middleware(MiddlewareMixin): @staticmethod def process_exception(request, exception): """檢視函式發生異常時呼叫""" print("-----process_exception1-----") print(exception) class ExceptionTest2Middleware(MiddlewareMixin): @staticmethod def process_exception(request, exception): """檢視函式發生異常時呼叫""" print("-----process_exception2-----")
admin後臺管理
admin的使用
- 1) 本地化。語言和時區本地化。
LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai'
- 2) 建立超級管理員。
python mange.py createsuperuser
- 3) 註冊模型類。
- 4)
- 4.1.自定義管理頁面。
- 4.2.自定義模型管理類。
- 4.3.註冊模型類的時候給register函式新增第二個引數,就是自定義模型管理類的名字。
列表頁選項
列表頁選項示例程式碼
models.py
class AreaInfo(models.Model): """地區模型類""" # 地區名稱 atitle = models.CharField(verbose_name="地區名", max_length=20) # 自關聯屬性 aParent = models.ForeignKey('self', null=True, blank=True) # 在admin點進去表之後顯示地區名 def __str__(self): return self.atitle # 定義title列,提供顯示atitle def title(self): return self.atitle title.admin_order_field = 'id' # 定義title列的排序方式 title.short_description = '地區名稱' # 定義title列顯示的列名 def parent(self): if self.aParent is None: return '' return self.aParent.atitle parent.short_description = '父級地區名稱'
admin.py
class AreaInfoAdmin(admin.ModelAdmin): """地區模型管理類""" list_per_page = 10 # 指定每頁顯示10條資料 list_display = ['id', 'atitle', 'title', 'parent'] # 指定頁面上展示的內容 actions_on_bottom = True # 開啟下面的action框 actions_on_top = False # 關閉上建的action框 list_filter = ['atitle'] # 頁表右側的過濾蘭 search_fields = ['atitle'] # 列表頁上方的搜尋框 admin.site.register(models.AreaInfo, AreaInfoAdmin)
注:list_display不僅可以寫模型類的屬性,還可以寫方法;
顯示效果
編輯頁選項
初始效果圖
fields控制顯示欄位順序
class AreaInfoAdmin(admin.ModelAdmin): fields = ['aParent', 'atitle'] # 控制編輯頁中 顯示欄位的順序
改變順序後
分組顯示
class AreaInfoAdmin(admin.ModelAdmin): """地區模型管理類""" fieldsets = ( ('基本', {'fields': ['atitle']}), ('高階', {'fields': ['aParent']}) )
分組顯示效果圖
應注意 ,fields和fieldsets不能同時使用。
關聯物件/控制顯示該地區下面的子級地區
塊嵌入
# 塊嵌入 class AreaStackedInline(admin.StackedInline): # 寫多類的名稱 model = models.AreaInfo # 關聯子物件 extra = 2 # 控制多餘的行數/額外編輯2個子物件 class AreaInfoAdmin(admin.ModelAdmin): """地區模型管理類""" inlines = [AreaStackedInline]
表嵌入
class AreaTabularInline(admin.TabularInline): model = models.AreaInfo # 關聯子物件 extra = 2 # 控制多餘的行數/額外編輯2個子物件 class AreaInfoAdmin(admin.ModelAdmin): """地區模型管理類""" inlines = [AreaStackedInline]
表嵌入效果圖
塊嵌入和表嵌入其實顯示的內容是一樣的,知識顯示樣式不同而已。
&n