[Python] Django框架入門5——靜態文件、中間件、上傳圖片和分頁
說明:
本文主要描述Django其他的內容,涉及靜態文件處理、中間件、上傳文件、分頁等。
開發環境:win10、Python3.5、Django1.10。
一、靜態文件處理
在Django項目的靜態文件主要指的是css、js和圖片等文件。
1、配置靜態文件
在settings.py文件中配置靜態內容:
STATIC_URL:在html文件中使用的路徑,如:"/static/images/logo.png"。
STATICFILES_DIRS:指靜態文件在項目的存放位置。
2、新建目錄
在項目目錄下(與manager.py同級)創建static目錄,再在static目錄下創建當前應用的名稱:
此時可以將靜態文件加入到對應的應用中:"/static/myapp/css"、"/static/myapp/js" 。
3、應用
在模板中可以使用硬編碼
在模板可以使用static編碼
二、中間件
在Django中的中間件,是一個輕量級、底層的插件系統,可以介入Django的請求和響應處理過程,修改Django的輸入或輸出。
使用中間件:把中間件添加到配置文件(settings.py)中的MIDDLEWARE_CLASSES元組中。
1、每個中間件組件是一個獨立的Python類,可以定義下面方法中的一個或多個:
__init__:無需任何參數,服務器響應第一個請求的時候調用一次,用於確定是否啟用當前中間件。
process_request( request ):執行視圖之前被調用,在每個請求上調用,返回None或HttpResponse對象。
process_view( request, view_func, view_args, view_kwargs ):調用視圖之前被調用,在每個請求上調用,返回None或HttpResponse對象。
process_template_response( request, response ):在視圖剛好執行完畢之後被調用,在每個請求上調用,返回實現了render方法的響應對象。
process_response( request, response ):所有響應放回瀏覽器之前被調用,在每個請求上調用,返回HttpResponse對象。
process_exception( request, response, exception ):當視圖拋出異常時調用,在每個請求上調用,返回一個HttpResponse對象。
如圖所示
2、實例:自定義異常處理
》在與配置文件(settings.py)同級目錄下創建 myexception.py文件,定義類MyException,實現process_exception方法,編碼如下:
》註冊中間件,將MyException註冊到settings.py的中間件(MIDDLEWARE、Django1.4-1.9 是 MIDDLEWARE_CLASSES)中:
》定義一個視圖,並拋出一個異常,則會運行自定義的異常處理
三、上傳文件
當Django在處理文件上傳的時候,文件數據唄保存在request.FILES中。
FILES中的每個鍵為 <input type="file" name=""> 中的name。
值得註意的是:FILES只有在請求方式為POST,並提交的<form>帶有enctype="multipart/form-data"的情況下才會包含數據。否則,FILES將會是一個空的類似於字典的對象。
下面是實例(保存上傳圖片):
1、使用模型處理上傳的文件:將屬性定義為 models.ImageField類型
註意:如果屬性類型為ImageField,需要安裝Pilow,已安裝則忽略
2、圖片存儲路徑:
在項目的static目錄下創建 media文件夾,圖片上傳後,會保存到 "/static/media/圖片文件"。
打開settings.py文件,添加 media_root項:
可以使用Django管理後臺,遇到ImageField類型的屬性會出現一個files框,完成上傳。
3、手動上傳模板代碼:
4、手動上傳視圖代碼:
四、分頁
Django框架提供了一些實現管理數據分頁的類,這些類位於 django/core/paginator.py 中。
1、Paginator對象
__init__( 列表, int ):返回分頁對象,參數為列表數據,每頁數據的條數。
count:對象總數。
num_page:頁面總數。
page_range:頁碼列表,從1開始,例如[1, 2, 3, 4]
page( num ):下標以1開始,如果提供的頁碼不存在,拋出InvalidPage異常。
異常Exception:
InvalidPage:當向page()傳入一個無效的頁碼時拋出。
PageNotAnInteger:當向page()傳入一個不是整數的值拋出。
EmptyPage:當向page()提供一個有效值,但是那頁面上沒有任何對象時拋出。
2、Page對象:
Paginator對象的 page() 方法返回 Page 對象,不需要手動構建。
屬性:
object_list:當前頁上所有對象的列表。
number:當前頁的序號,從 1 開始。
paginator:當前 page 對象相關的 Paginator 對象。
方法:
has_next():如果有下一頁則返回True。
has_previus():如果有上一頁則返回True。
has_other_pages():如果有上一頁或下一頁則返回True。
next_page_number():返回下一頁的頁碼,如果下一頁不存在,拋出 InvalidPage 異常。
len():返回當前頁面對象的個數。
叠代頁面對象:返回當前頁面中的每個對象
3、實例
》創建視圖
》配置url
》定義模板
[Python] Django框架入門5——靜態文件、中間件、上傳圖片和分頁