我寫的部落格程式,為了實現一些特殊的功能,需要自己寫個過濾器。現在把方法記錄下來。

過濾器的功能大概如下,在資料庫裡取出儲存的html程式碼(各種富文字編輯器儲存的程式碼)。然後取出來展示,做類似於文章列表。在一開始,我們會這樣取出來:

{% autoescape off %} {{  post.myContent}}  {% endautoescape %}

但是這個時候就會開始載入圖片資源(有img標籤),如果圖片太多,太大,就會使頁面載入得太慢。使用者體驗很差。

也許你會問,為什麼不用jquery的lazyload外掛,我覺得那是偽的延遲載入,根本無助於減輕伺服器的壓力。

所以現在需要寫個過濾器,在無須載入圖片的時候,先使得伺服器不用載入圖片。

正文如下:

在app目錄下,新建一個目錄:

templatetags            (名字不要搞錯

 

├── filters.py        (隨便建一個檔案,名字隨便起

├── filters.pyc

├── __init__.py     (這個是自己建立的空檔案,只要名字對就行

└── __init__.pyc

現在看內容:
 
  1. #!/usr/bin/env python   
  2. #coding:utf-8  
  3.  
  4. from django import template 
  5. register = template.Library() 
  6.  
  7. def cut_p_w_picpathtags(value): 
  8.     print value 
  9.     return value 
  10.  
  11. register.filter(`cut_p_w_picpathtags`, cut_p_w_picpathtags) 
自己編寫過濾器很簡單,只需要兩個步驟:
1、定義一個函式,接收至少一個引數,如function(value,arg)
2、使用register.fileter(`過濾器名字`,函式名)     註冊過濾器

接下來就是使用了。
在html檔案中:
{% load filters %}   //fileters 是過濾器的那個檔名
{% autoescape off %} {{  post.myContent|cut_p_w_picpathtags}}  {% endautoescape %}
 

 

先看個沒用過濾器之前的例子,載入頁面時,伺服器端:

 

[24/Jul/2012 02:35:46] “GET /media/1343066025.950.280283821055DeepinScrot-0444.png HTTP/1.1” 200 43561

[24/Jul/2012 02:35:46] “GET /media/1343066026.890.981396435618DeepinScrot-1556.png HTTP/1.1” 200 57454

[24/Jul/2012 02:35:46] “GET /media/1343066026.030.717419530083DeepinScrot-1029.png HTTP/1.1” 200 339557

看到瀏覽器向伺服器請求了三張圖片。
 
使用了過濾器之後,就沒有再請求圖片資源了。
 
自定義過濾器的方法就是如此,就看大家自己要應用在哪些場景上了。