使用Django应用程序的YSlow最佳实践,如何实现它们?

时间:2009-11-07 16:31:49

标签: django performance django-templates scalability

我有一个django 1.1.1应用程序,实际上是在开发中,在最佳实践中思考我运行了YSlow测试(E级规则集应用:YSlow V2)它建议:

  
    

添加过期标题上的F级

         

- 有37个静态组件没有远期到期日。

         

使用内容分发网络(CDN)F级

         

- 有37个静态组件不在CDN上。

         

使用gzip压缩组件的等级

         

- 有17个纯文本组件应该压缩发送

  

如何使用Django实现它?

更多上下文:Python 2.5,webfaction部署

示例:

  
    

F级以减少HTTP请求

         

此页面有14个外部Javascript脚本。尝试将它们合二为一。     此页面有4个外部样式表。尝试将它们合并为一个。

         

可以使用Django-Compress

解决   

3 个答案:

答案 0 :(得分:3)

在您列出的三个中,有两个可在Web服务器级别进行寻址。例如,在Linux / Apache中:

对于gzip,请编辑/etc/apache2/mods-available/deflate.conf

<IfModule mod_deflate.c>  
    AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript text/javascript text/css application/javascript  
</IfModule>  

对于Expires标头,首先需要启用mod_expires:

>cd /etc/apache2
>sudo ln -s ../mods-available/expires.load mods-enabled/expires.load

然后,您需要为所需的MIME类型配置它:

# edit /etc/apache2/sites-available/default  
ExpiresActive On  
ExpiresByType text/css "access plus 12 hours"  
ExpiresByType application/javascript "access plus 12 hours"  
ExpiresByType image/png "access plus 12 hours"  
ExpiresByType image/gif "access plus 12 hours"  

撰写关于为什么我推荐12小时here的原因。

最后一项(CDN)通常是您外包给Akamai之类的人。它也很贵。

答案 1 :(得分:2)

我非常同意Chase。我基于Steve Souders和Nicholas Zakas的工作开发了一些django程序。

我的标准做法是:

  • 安装django-mediagenerator,它是以下基础:
    • 将JS和CSS与mediagenerator捆绑包结合使用
    • 将mediagenerator配置为使用google-closure和使用YUICompressor的CSS自动压缩JS
    • 所有静态媒体(非上传)也由mediagenerator进行管理。这允许您使用远期的过期标题,例如10年。
  • 最大限度地减少图像的使用,并尝试仅在CSS中生成大部分网站。
  • 我必须使用小图片,base64将它们内嵌在CSS文件中(使用mediagenerator)
  • 如果它们是大图像,将它们组合成一个精灵(尽管我很少使用大图像)
  • Nginx和gunicorn的部署

nginx.conf中的Nginx gzip配置:

gzip_http_version 1.1;
gzip_vary on;
gzip_comp_level 6;
gzip_proxied any;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_buffers 64 16k;
gzip_disable “MSIE [1-6].(?!.*SV1)”;

Nginx远期期货到期头:

location /media/ {
    alias   /home/domains/example.com/project/_generated_media/;
    expires 10y;
    add_header Cache-Control public;
}   

他们只留下的项目是图片上传,但仍可以在将来过期时使用,因为当图片发生变化时,文件名也应该改变。

使用这些技术,我制作了包含3个http请求的网站。 html文件,标题中的一个CSS请求,以及页面呈现后页脚中的一个JS请求。

答案 2 :(得分:0)

这些都与Django无关,因为YSlow指的是您网站上的静态资产 - JS,CSS和图像。通过开发服务器提供这些服务肯定会导致成绩不合格,但做得更好将取决于您如何配置最终提供服务的真实服务器。