Django 动态文件服务优化
我正在做一个django项目,这个项目提供一个API,用来生成图片的缩略图,基本的逻辑是这样的:
当第一次收到源图片的URL时,django会进行一些图片处理,然后返回缩略图。
当同样的图片URL再次出现时,django会直接提供之前存储的缩略图(作为静态媒体存储)。
基本上,第二种情况发生的频率远高于第一种情况。现在我一直用django来提供这些图片,我觉得这样做不太好。
我想知道有没有更好的方法来处理第二种情况的图片提供?比如,有没有办法让django向apache发送代理请求,让apache来提供这个文件?
我知道我可以用HTTP重定向来实现,但这样似乎会在客户端生成太多的重定向请求(一个HTML页面会包含很多指向这个API的链接)。
谢谢。
3 个回答
比如说,有没有什么方法可以让Django把请求转发给Apache,然后让Apache来提供文件呢?
你这个理解完全反了。
去看看Django的部署指南吧。 https://docs.djangoproject.com/en/1.3/howto/deployment/modwsgi/#serving-files
Apache应该一直负责提供所有的静态文件(比如图片)。永远都是这样。
Django绝对不应该提供图片文件(或者.css、.js,除了.html以外的任何文件)。
请查看文档后面的部分:
http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines#The_Apache_Alias_Directive
使用 Alias/AddHandler/mod_rewrite 可以让 Django 在文件系统中覆盖静态文件。换句话说,静态文件会优先处理。
我想到的最简单的解决办法就是用Apache的重写规则加上一个条件。
RewriteCond %(REQUEST_URI) ^media
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule #Some rewrite rule to redirect from '/media/filename' to '/image_generator/filename'
这个规则基本上就是检查一下文件在媒体目录里是否存在,如果不存在,就把用户引导到一个图片生成器,这样它就可以生成文件并保存到/media目录下,以便下次请求时能找到。
注意:我其实从来没有在Django中尝试过这种重定向,所以可能需要做一些调整。