django-jinjia 集成

現成包能夠參考這裏:  http://niwibe.github.io/django-jinja/ python

Requirements

  • 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返回。

loader修改以下(源碼參考這裏,文檔參考這裏

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同樣的技術或者機制咯。看來大有比較本身集成。

相關文章
相關標籤/搜索