1. 程式人生 > >[Python] Django框架入門5——靜態文件、中間件、上傳圖片和分頁

[Python] Django框架入門5——靜態文件、中間件、上傳圖片和分頁

manage input 上傳文件 數據分頁 提交 family 數據 3.5 func

說明:

  本文主要描述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——靜態文件、中間件、上傳圖片和分頁