Django静态文件处理、中间件及Admin站点
Django靜態文件處理、中間件及Admin站點
文章目錄
- Django靜態文件處理、中間件及Admin站點
- 一、靜態文件
- 1.簡介
- 2.示例
- 3.配置靜態文件
- 二、中間件
- 1.簡介
- 2.示例
- 3.異常中間件
- 三、Admin站點
- 1.簡介
- 2.控制管理頁展示
- 3.列表頁選項
- 4.編輯頁選項
- 5.重寫模板
一、靜態文件
1.簡介
- 項目中的CSS、圖片、js都是靜態文件。
- 一般會將靜態文件放到一個單獨的目錄中,以方便管理。
- 在html頁面中調用時,也需要指定靜態文件的路徑,Django中提供了一種解析的方式配置靜態文件路徑。
- 靜態文件可以放在項目根目錄下,也可以放在應用的目錄下,由于有些靜態文件在項目中是通用的,所以推薦放在項目的根目錄下,方便管理。
2.示例
1)在test5/settings.py文件中定義靜態文件存放的物理目錄。
STATIC_URL = '/static/' STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), ]2)在項目根目錄下創建static目錄,再創建img、css、js目錄。
mkdir -p static/{img,css,js}3)在booktest/views.py中定義視圖static_test。
def static_test(request):return render(request,'booktest/static_test.html')4)在booktest/urls.py中配置url。
url(r'^static_test/$',views.static_test),5)在templates/booktest/下創建static_test.html文件。
<html> <head><title>靜態文件</title> </head> <body> <img src="/static/img/sg.png"/> </body> </html>6)保存圖片到static/img/目錄下,名稱為sg.png。
7)運行服務器,瀏覽效果如下圖:
3.配置靜態文件
Django提供了一種配置,可以在html頁面中可以隱藏真實路徑。
1)在test5/settings.py文件中修改STATIC_URL項。
# STATIC_URL = '/static/' STATIC_URL = '/abc/'2)刷新瀏覽器,圖片找不到了,效果如下圖:
3)修改templates/booktest/static_test.html如下:
4)刷新瀏覽器,效果如下圖:
5)查看網頁源代碼,發現可以網址和真實地址之間沒有關系。
- 為了安全可以通過配置項隱藏真實圖片路徑,在模板中寫成固定路徑,后期維護太麻煩,可以使用static標簽,根據配置項生成靜態文件路徑。
1)修改templates/booktest/static_test.html如下:
<html> <head><title>靜態文件</title> </head> <body> 修改前:<img src="/static/img/sg.png"/> <hr> 修改后:<img src="/abc/img/sg.png"/> <hr> 動態配置: {%load static from staticfiles%} <img src="{%static "img/sg.png" %}"/> </body> </html>2)刷新瀏覽器,效果如下圖:
查看網頁源代碼如下圖:
- 說明:這種方案可以隱藏真實的靜態文件路徑,但是結合Nginx布署時,會將所有的靜態文件都交給Nginx處理,而不用轉到Django部分,所以這項配置就無了。
二、中間件
1.簡介
- Django中的中間件是一個輕量級、底層的插件系統,可以介入Django的請求和響應處理過程,修改Django的輸入或輸出。
- 中間件的設計為開發者提供了一種無侵入式的開發方式,增強了Django框架的健壯性,其它的MVC框架也有這個功能,名稱為IoC。
- Django在中間件中預置了五個方法,這五個方法的區別在于不同的階段執行,對輸入或輸出進行干預,方法如下:
- 1)初始化:無需任何參數,服務器響應第一個請求的時候調用一次,用于確定是否啟用當前中間件。
- 2)處理請求前:在每個請求上,request對象產生之后,url匹配之前調用,返回None或HttpResponse對象。
- 3)處理視圖前:在每個請求上,url匹配之后,視圖函數調用之前調用,返回None或HttpResponse對象。
- 4)處理響應后:視圖函數調用之后,所有響應返回瀏覽器之前被調用,在每個請求上調用,返回HttpResponse對象。
- 5)異常處理:當視圖拋出異常時調用,在每個請求上調用,返回一個HttpResponse對象。
__init__:服務器響應第一個請求的時候調用。
process_request:是在產生request對象,進行url匹配之前調用。
process_view:是url匹配之后,調用視圖函數之前。
process_response:視圖函數調用之后,內容返回給瀏覽器之前。
process_exception:視圖函數出現異常,會調用這個函數。
如果注冊的多個中間件類中包含process_exception函數的時候,調用的順序跟注冊的順序是相反的。
2.示例
中間件是一個獨立的python類,,可以定義這五個方法中的一個或多個。
1)在booktest/目錄下創建middleware.py文件,代碼如下:
class my_mid:def __init__(self):print '--------------init'def process_request(self,request):print '--------------request'def process_view(self,request, view_func, *view_args, **view_kwargs):print '--------------view'def process_response(self,request, response):print '--------------response'return response2)在test5/settings.py文件中,向MIDDLEWARE_CLASSES項中注冊。
3)修改booktest/views.py中視圖index。
4)運行服務器,命令行中效果如下圖:
5)刷新頁面,命令行中效果如下圖:
3.異常中間件
1)在booktest/middleware.py中定義兩個異常類如下:
class exp1:def process_exception(self,request,exception):print '--------------exp1' class exp2:def process_exception(self,request,exception):print '--------------exp2'2)在test5/settings.py文件中,向MIDDLEWARE_CLASSES項中注冊。
3)修改booktest/views.py中視圖index。
總結:如果多個注冊的中間件類中都有process_exception的方法,則先注冊的后執行。
獲取瀏覽器端的ip地址
使用request對象的META屬性:request.META['REMOTE_ADDR']
三、Admin站點
1.簡介
內容發布的部分由網站的管理員負責查看、添加、修改、刪除數據,開發這些重復的功能是一件單調乏味、缺乏創造力的工作,為此,Django能夠根據定義的模型類自動地生成管理模塊。
在Django項目中默認啟用Admin管理站點。
1)準備工作:創建管理員的用戶名和密碼。
python manage.py createsuperuser按提示填寫用戶名、郵箱、密碼。
2)使用:在應用的admin.py中注冊模型類
例:打開booktest/admin.py文件,注冊地區模型。
from django.contrib import admin from booktest.models import * admin.site.register(AreaInfo)3)輸入如下網址:
http://127.0.0.1:8000/admin/按提示填寫用戶名、密碼,點擊“Log in”按鈕登錄。
登錄成功后,可以看到AreaInfos,可以進行增加、修改、刪除、查詢的管理。
列表頁顯示效果如下圖:
2.控制管理頁展示
- 類ModelAdmin可以控制模型在Admin界面中的展示方式,主要包括在列表頁的展示方式、添加修改頁的展示方式。
1)在booktest/admin.py中,注冊模型類前定義管理類AreaAdmin。
class AreaAdmin(admin.ModelAdmin):pass- 管理類有兩種使用方式:
- 注冊參數
- 裝飾器
- 注冊參數:打開booktest/admin.py文件,注冊模型類代碼如下:
- 裝飾器:打開booktest/admin.py文件,在管理類上注冊模型類,代碼如下:
3.列表頁選項
- 頁大小
每頁中顯示多少條數據,默認為每頁顯示100條數據,屬性如下:
list_per_page=1001)打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin):list_per_page = 102)在瀏覽器中查看區域信息的列表頁面,效果如下圖:
- "操作選項"的位置
頂部顯示的屬性,設置為True在頂部顯示,設置為False不在頂部顯示,默認為True。
actions_on_top=True底部顯示的屬性,設置為True在底部顯示,設置為False不在底部顯示,默認為False。
actions_on_bottom=False1)打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin):...actions_on_top = Trueactions_on_bottom = True2)在瀏覽器中刷新效果如下圖:
- 列表中的列
屬性如下:
list_display=[模型字段1,模型字段2,...]1)打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin): ... list_display = ['id','atitle']2)在瀏覽器中刷新效果如下圖:
點擊列頭可以進行升序或降序排列。
- 將方法作為列
列可以是模型字段,還可以是模型方法,要求方法有返回值。
1)打開booktest/models.py文件,修改AreaInfo類如下:
class AreaInfo(models.Model):...def title(self):return self.atitle2)打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin):...list_display = ['id','atitle','title']3)在瀏覽器中刷新效果如下圖:
方法列是不能排序的,如果需要排序需要為方法指定排序依據。
1)打開booktest/models.py文件,修改AreaInfo類如下:
class AreaInfo(models.Model):...def title(self):return self.atitletitle.admin_order_field='atitle'2)在瀏覽器中刷新效果如下圖:
- 列標題
列標題默認為屬性或方法的名稱,可以通過屬性設置。需要先將模型字段封裝成方法,再對方法使用這個屬性,模型字段不能直接使用這個屬性。
1)打開booktest/models.py文件,修改AreaInfo類如下:
class AreaInfo(models.Model):...title.short_description='區域名稱'2)在瀏覽器中刷新效果如下圖:
- 關聯對象
無法直接訪問關聯對象的屬性或方法,可以在模型類中封裝方法,訪問關聯對象的成員。
1)打開booktest/models.py文件,修改AreaInfo類如下:
class AreaInfo(models.Model):...def parent(self):if self.aParent is None:return ''return self.aParent.atitleparent.short_description='父級區域名稱'2)打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin):...list_display = ['id','atitle','title','parent']3)在瀏覽器中刷新效果如下圖:
- 右側欄過濾器
屬性如下,只能接收字段,會將對應字段的值列出來,用于快速過濾。一般用于有重復值的字段。
1)打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin):...list_filter=['atitle']2)在瀏覽器中刷新效果如下圖:
- 搜索框
屬性如下,用于對指定字段的值進行搜索,支持模糊查詢。列表類型,表示在這些字段上進行搜索。
search_fields=[]1)打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin):...search_fields=['atitle']2)在瀏覽器中刷新效果如下圖:
- 中文標題
1)打開booktest/models.py文件,修改模型類,為屬性指定verbose_name參數,即第一個參數。
2)在瀏覽器中刷新效果如下圖:
4.編輯頁選項
- 顯示字段順序
屬性如下:
fields=[]1)點擊某行ID的鏈接,可以轉到修改頁面,默認效果如下圖:
2)打開booktest/admin.py文件,修改AreaAdmin類如下:
3)刷新瀏覽器效果如下圖:
在下拉列表中輸出的是對象的名稱,可以在模型類中定義str方法用于對象轉換字符串。
2)刷新瀏覽器效果如下圖:
- 分組顯示
屬性如下:
fieldset=(('組1標題',{'fields':('字段1','字段2')}),('組2標題',{'fields':('字段3','字段4')}), )1)打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin):...# fields=['aParent','atitle']fieldsets = (('基本', {'fields': ['atitle']}),('高級', {'fields': ['aParent']}))2)刷新瀏覽器效果如下圖:
說明:fields與fieldsets兩者選一使用。
- 關聯對象
在一對多的關系中,可以在一端的編輯頁面中編輯多端的對象,嵌入多端對象的方式包括表格、塊兩種。 類型InlineModelAdmin:表示在模型的編輯頁面嵌入關聯模型的編輯。子類TabularInline:以表格的形式嵌入。子類StackedInline:以塊的形式嵌入。
1)打開booktest/admin.py文件,創建AreaStackedInline類。
class AreaStackedInline(admin.StackedInline):model = AreaInfo#關聯子對象extra = 2#額外編輯2個子對象2)打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin):...inlines = [AreaStackedInline]3)刷新瀏覽器效果如下圖:
- 可以用表格的形式嵌入。
1)打開booktest/admin.py文件,創建AreaTabularInline類。
class AreaTabularInline(admin.TabularInline):model = AreaInfo#關聯子對象extra = 2#額外編輯2個子對象2)打開booktest/admin.py文件,修改AreaAdmin類如下:
class AreaAdmin(admin.ModelAdmin):...inlines = [AreaTabularInline]3)刷新瀏覽器效果如下圖:
5.重寫模板
1)在templates/目錄下創建admin目錄,結構如下圖:
2)打開當前虛擬環境中Django的目錄,再向下找到admin的模板,目錄如下:
3)將需要更改文件拷貝到第一步建好的目錄里,此處以base_site.html為例。
編輯base_site.html文件:
4)在瀏覽器中轉到列表頁面,刷新后如下圖:
其它后臺的模板可以按照相同的方式進行修改。
總結
以上是生活随笔為你收集整理的Django静态文件处理、中间件及Admin站点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django模版(三)
- 下一篇: Django上传文件及分页