現成包能夠參考這裏: http://niwibe.github.io/django-jinja/ python
Python 2.7, 3.3 or 3.4git
Django 1.4, 1.5, 1.6 and 1.7github
jinja2 >= 2.7.0 算法
不過下面的實現沒有用到上面的django-jinja 擴展。django
不知道隨着django版本的演變,又沒有吸收jinjia2設計的精華,若是有,那麼再手工集成就是畫蛇添足。決定來個性能測試,環境:api
win7 家庭版 64bit / python 2.7.3 / django 1.6.5app
因爲須要頁面每次請求都返回不一樣的內容,所以簡單作了個隨機數,視圖以下:dom
from django.shortcuts import render from django.http import HttpResponse import random # Create your views here. def getRandom(req): return render(req,'testjj.txt',{'r_int':random.randint(1,10000)})
在虛擬機上用ab進行測試:性能
ab -c 5 -n 1000 http://192.168.1.8:8000/
結果以下:測試
Concurrency Level: 5 Time taken for tests: 5.021 seconds Complete requests: 1000 Failed requests: 95 (Connect: 0, Receive: 0, Length: 95, Exceptions: 0) Write errors: 0 Total transferred: 165895 bytes HTML transferred: 3895 bytes Requests per second: 199.18 [#/sec] (mean) Time per request: 25.103 [ms] (mean) Time per request: 5.021 [ms] (mean, across all concurrent requests) Transfer rate: 32.27 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.2 0 2 Processing: 17 24 3.9 24 65 Waiting: 15 22 3.7 22 62 Total: 18 25 4.0 24 67 Percentage of the requests served within a certain time (ms) 50% 24 66% 25 75% 26 80% 26 90% 28 95% 29 98% 31 99% 41 100% 67 (longest request)
總時間5.021s。上面沒有采用jinjia2, 下面採用jinjia2,代碼修改以下,
主要是增長template_loader,ok,先看看django的默認的template loader的邏輯,默認的loader有兩個,以下,能夠參考這裏。
django.template.loaders.filesystem.Loader
django.template.loaders.app_directories.Loader
算法的核心是根據某種規則,計算出模板文件的路徑,並read而後decode返回。
from django.template.loader import BaseLoader from django.template.loaders.app_directories import app_template_dirs from django.template import TemplateDoesNotExist from django.core import urlresolvers from django.conf import settings import jinja2 class Template(jinja2.Template): def render(self, context): # flatten the Django Context into a single dictionary. context_dict = {} for d in context.dicts: context_dict.update(d) return super(Template, self).render(context_dict) class Loader(BaseLoader): is_usable = True env = jinja2.Environment(loader=jinja2.FileSystemLoader(app_template_dirs)) env.template_class = Template # These are available to all templates. env.globals['url_for'] = urlresolvers.reverse env.globals['MEDIA_URL'] = settings.MEDIA_URL #env.globals['STATIC_URL'] = settings.STATIC_URL def load_template(self, template_name, template_dirs=None): try: template = self.env.get_template(template_name) except jinja2.TemplateNotFound: raise TemplateDoesNotExist(template_name) return template, template.filename
而後在template_loaders中添加該loader。並從新測試,結果以下:
Time taken for tests: 4.223 seconds Complete requests: 1000 Failed requests: 100 (Connect: 0, Receive: 0, Length: 100, Exceptions: 0) Write errors: 0 Total transferred: 165887 bytes HTML transferred: 3887 bytes Requests per second: 236.78 [#/sec] (mean) Time per request: 21.117 [ms] (mean) Time per request: 4.223 [ms] (mean, across all concurrent requests) Transfer rate: 38.36 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.2 0 2 Processing: 12 20 3.3 20 49 Waiting: 11 18 3.0 17 47 Total: 12 21 3.3 20 50 Percentage of the requests served within a certain time (ms) 50% 20 66% 21 75% 22 80% 23 90% 24 95% 26 98% 29 99% 34 100% 50 (longest request)
可見,總時間少了接近1秒!
對比圖以下:
所以,django團隊,在這塊貌似仍是沒有采起與jinja2同樣的技術或者機制咯。看來大有比較本身集成。