【问题标题】:django dynamic file serving optimizationdjango 动态文件服务优化
【发布时间】:2012-01-20 19:36:30
【问题描述】:

我正在做一个django项目,它提供了一个API来生成图片的缩略图,基本逻辑如下:

  1. 当源图像 URL 第一次出现时,django 会进行某种图像处理,并返回缩略图图像

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

基本上,案例 2 比案例 1 发生的频率更高。现在我一直使用 django 来提供图像,我认为这是一种不好的做法。

我想知道是否可以为案例 2 提供更好的图像服务方式?例如,是否有某种方式要求 django 向 apache 发送代理请求并要求 apache 提供文件?

我知道我可以使用 HTTP 重定向来执行此操作,但这似乎会在客户端生成过多的重定向请求(一个 HTML 页面将包含很多指向此 API 的链接)。

谢谢。

【问题讨论】:

    标签: python django apache


    【解决方案1】:

    我想到的最简单的解决方案是使用带有条件的 Apache 重写规则。

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

    这基本上只是检查文件是否存在于媒体目录中,如果不存在,它将用户发送到图像生成器,然后生成文件并将其保存到 /media 可以找到的位置下一个请求。

    注意:我实际上从未尝试过使用 Django 进行这种重定向,因此可能需要进行一些调整。

    【讨论】:

    • 感谢您的提示,我检查了httpd.apache.org/docs/current/mod/mod_rewrite.html#RewriteCond,但这需要我将完整的本地图像路径传递给 URL,对吗?
    • REQUEST_FILENAME 变量应包含系统上文件的路径,由 Apache 从 URI 解析。因此,您不需要通过 URI 传递任何本地路径。对此有一些警告,在您链接到的 Apache 文档中进行了描述,但我很确定它应该在这种情况下工作。
    • 谢谢,我想这可行,但我可能需要更改 URL 结构。
    • 只是一些更新,我发现以下链接也非常有用:simonecarletti.com/blog/2009/01/… 最终我通过整合这个答案和 URL 解决了这个问题
    【解决方案2】:

    例如,有没有某种方法可以让 django 向 apache 发送代理请求并让 apache 提供文件?

    你完全倒退了。

    阅读 Django 部署指南。 https://docs.djangoproject.com/en/1.3/howto/deployment/modwsgi/#serving-files

    Apache 应该始终提供所有静态文件(例如图像)。总是。

    Django 永远不应该提供图像文件(或 .css 或 .js 或 .html 以外的任何文件)。

    【讨论】:

    • @SLott,有时您想创建动态资源。例如,1234px by 567px image
    • @FakeRainBrigand:正确。您必须在媒体目录中创建一个文件,然后由 Apache 在正常处理响应的过程中提供服务。您不希望您的 Django 线程浪费时间等待客户端桌面的(缓慢)字节涓涓细流。您希望 Apache(和缓存)在 Django 之外处理这个问题。
    • 是的,我知道这不是一个好习惯。但是在所描述的情况下,缩略图在第一次调用完成之前不存在,那么我应该如何在 apache 中描述呢?
    • @Walty:您不会“向 Apache 描述它”。您的 Django 视图函数只是在媒体目录已由 Apache 提供服务 中创建文件。发送 HTML 页面后,浏览器请求图像,这些图像由 Apache 发送。不是 Django。
    【解决方案3】:

    请参阅文档中本节的后面部分:

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

    使用 Alias/AddHandler/mod_rewrite 允许 Django 覆盖文件系统中的静态文件。换句话说,静态文件优先。

    【讨论】:

      猜你喜欢
      • 2017-11-02
      • 1970-01-01
      • 2016-04-05
      • 2013-12-08
      • 2016-12-22
      • 2010-11-13
      • 2019-08-29
      • 1970-01-01
      • 2013-07-12
      相关资源
      最近更新 更多