现成包可以参考这里:  http://niwibe.github.io/django-jinja/

Requirements

  • Python 2.7, 3.3 or 3.4

  • Django 1.4, 1.5, 1.6 and 1.7

  • jinja2 >= 2.7.0

不过下面的实现没有用到上面的django-jinja 扩展。

不知道随着django版本的演变,又没有吸取jinjia2设计的精华,如果有,那么再手工集成就是多此一举。决定来个性能测试,环境:

win7 家庭版 64bit / python 2.7.3 / django 1.6.5

由于需要页面每次请求都返回不同的内容,因此简单做了个随机数,视图如下:

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一样的技术或者机制咯。看来大有比较自己集成。

django-jinjia 集成的更多相关文章

  1. Django开发——集成的子框架django.contrib

    Django开发——集成的子框架django.contrib 2018年09月11日 19:32:42 Mrkang1314 阅读数:63  https://blog.csdn.net/mashaok ...

  2. 用Jenkins构建Django持续集成环境

    用Jenkins构建Django持续集成环境 - V2EX https://www.v2ex.com/t/32054

  3. Django优雅集成MongoDB

    Django优雅集成MongoDB   将Django与MongoDB集成 在不更改Django ORM的情况下,将MongoDB用作Django项目的后端数据库.使用Django Admin在Mon ...

  4. django之集成七牛云对象存储

    Python3 + Django2.0 集成 "七牛云" 对象存储 (SDK文档地址:http://developer.qiniu.com/kodo/api/3928/error- ...

  5. django之集成阿里云通信(发送手机短信验证码)

    python3 + django2.0 集成 "阿里云通信" 服务: (SDK文档地址:https://help.aliyun.com/document_detail/55491. ...

  6. 在django中集成ckeditor富文本

    目前用的比较多的富文本插件有百度的ueditor.ckeditor.kindeditor等,其中ueditor和kindeditor比较美观,ckeditor的皮肤较少.但是ueditor加载较慢,k ...

  7. django xadmin 集成DjangoUeditor富文本编辑器

    本文档记录自己的学习历程! 介绍 Ueditor HTML编辑器是百度开源的在线HTML编辑器,功能非常强大 额外功能 解决图片视频等无法上传显示问题 Ueditor下载地址 https://gith ...

  8. django后台集成富文本编辑器Tinymce的使用

    富文本编辑器Tinymce是使用步骤: 1.首先去python的模块包的网站下载一个django-tinymce的包 2.下载上图的安装包,然后解压,进入文件夹,执行: (pychrm直接运行命令pi ...

  9. django之集成第三方支付平台PaysAPI与百度云视频点播服务接入

    PaysAPI直接查看接口文档:https://www.paysapi.com/docindex,比较简单 百度云视频点播服务接入: 1. 准备工作:百度云的示例:http://cyberplayer ...

  10. Django rest framework集成微博第三方登录

    Django restframework 集成第三方登录(微博.微信.QQ等) 友情链接 python-social-auth-app官方文档 微博开放者平台 QQ开放者平台 准备工作 1.注册微博开 ...

随机推荐

  1. android常用的弹出提示框

    我们在平时做开发的时候,免不了会用到各种各样的对话框,相信有过其他平台开发经验的朋友都会知道,大部分的平台都只提供了几个最简单的实现,如果我们想实现自己特定需求的对话框,大家可能首先会想到,通过继承等 ...

  2. http状态码介绍

    基本涵盖了所有问题HTTP 400 – 请求无效HTTP 401.1 – 未授权:登录失败HTTP 401.2 – 未授权:服务器配置问题导致登录失败HTTP 401.3 – ACL 禁止访问资源HT ...

  3. java多线程-Condition

    Condition 将 Object 监视器方法(wait.notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set ...

  4. Qt *.pro编写一般规则

    qmake 之 CONFIG 与 QT 乱谈 看qtcn论坛中经常有人忘记 QT+=network 等语句.随便写写吧,或许对他人有帮助. 写来写去,发现越写越乱,就这样吧,反正主要的内容很简单. d ...

  5. hdu 3068 最长回文子串 马拉车模板

    前几天用后缀数组写过一次这题,毫无疑问很感人的TLE了-_-|| 今天偶然发现了马拉车模板,O(N)时间就搞定 reference:http://acm.uestc.edu.cn/bbs/read.p ...

  6. SpringMVC实现一个controller里面有多个方法

    我们都知道,servlet代码一般来说只能在一个servlet中做判断去实现一个servlet响应多个请求, 但是springMVC的话还是比较方便的,主要有两种方式去实现一个controller里能 ...

  7. junit加载

    Run as junit 不会出现,把junit 包倒入lib文件夹中,在类的后面加上extends TestCase,此时上方会导入一个包:import junit.framework.TestCa ...

  8. HD 1533 Going Home(最小费用最大流模板)

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  9. Eclipse在线安装ADT插件

    要想使用Eclipse开发Android应用,首先要安装一个ADT插件,在此记录一下在Eclipse中采用在线安装的方式ADT插件,我使用的Eclipse版本是:eclipse-jee-luna-SR ...

  10. [Angularjs]ng-show和ng-hide

    写在前面 上篇文章介绍了ng-select和ng-options指令的使用,这篇文章继续指令的学习,本篇文章讲学习ng-show和ng-hide指令. 系列文章 [Angularjs]ng-selec ...