Django 动态文件服务优化

0 投票
3 回答
638 浏览
提问于 2025-04-17 08:24

我正在做一个django项目,这个项目提供一个API,用来生成图片的缩略图,基本的逻辑是这样的:

  1. 当第一次收到源图片的URL时,django会进行一些图片处理,然后返回缩略图。

  2. 当同样的图片URL再次出现时,django会直接提供之前存储的缩略图(作为静态媒体存储)。

基本上,第二种情况发生的频率远高于第一种情况。现在我一直用django来提供这些图片,我觉得这样做不太好。

我想知道有没有更好的方法来处理第二种情况的图片提供?比如,有没有办法让django向apache发送代理请求,让apache来提供这个文件?

我知道我可以用HTTP重定向来实现,但这样似乎会在客户端生成太多的重定向请求(一个HTML页面会包含很多指向这个API的链接)。

谢谢。

3 个回答

0

比如说,有没有什么方法可以让Django把请求转发给Apache,然后让Apache来提供文件呢?

你这个理解完全反了。

去看看Django的部署指南吧。 https://docs.djangoproject.com/en/1.3/howto/deployment/modwsgi/#serving-files

Apache应该一直负责提供所有的静态文件(比如图片)。永远都是这样。

Django绝对不应该提供图片文件(或者.css、.js,除了.html以外的任何文件)。

0

请查看文档后面的部分:

http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines#The_Apache_Alias_Directive

使用 Alias/AddHandler/mod_rewrite 可以让 Django 在文件系统中覆盖静态文件。换句话说,静态文件会优先处理。

2

我想到的最简单的解决办法就是用Apache的重写规则加上一个条件。

RewriteCond %(REQUEST_URI) ^media
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule #Some rewrite rule to redirect from '/media/filename' to '/image_generator/filename'

这个规则基本上就是检查一下文件在媒体目录里是否存在,如果不存在,就把用户引导到一个图片生成器,这样它就可以生成文件并保存到/media目录下,以便下次请求时能找到。

注意:我其实从来没有在Django中尝试过这种重定向,所以可能需要做一些调整。

撰写回答