代码之家  ›  专栏  ›  技术社区  ›  Edan Maor

Django应用程序应该如何捆绑静态媒体?

  •  13
  • Edan Maor  · 技术社区  · 15 年前

    背景:

    我第一次开始使用django,这也是我第一次涉足网络开发。我只是被困在“服务静态媒体”的问题上。在花了一段时间看了所有文档和stackoverflow问题之后,我想我了解了它应该如何工作(即media_root、media_url、更新url s文件等)。

    我的问题 :

    好吧,这是我不确定的部分。Django应用程序应该是“可插入的”,也就是说,我可以将应用程序从一个项目移动到另一个项目。那么,这些应用程序应该如何捆绑静态媒体呢?

    例如,假设我有一个“foo”应用程序,它有加载一些css/image文件的模板。我应该把这些文件放在哪里,这样一旦我包含了应用程序,它们就会自动得到服务?

    我看到的唯一解决方案是,安装应用程序必须包括额外的步骤,将其静态媒体复制到您自己的服务器上为该媒体提供服务的某个位置。

    这是公认的方法吗?它包括一个额外的步骤,但这可能是处理Web开发时的标准步骤(我是新的,所以我不知道)。

    另外,如果是这样的话,有没有一个标准的方法来收集我所有的静态媒体,以便更容易地知道我需要服务什么?(例如,在应用程序中是否有一个名为“media”的文件夹或其他东西是标准的?).

    谢谢,

    3 回复  |  直到 12 年前
        1
  •  9
  •   Carl Meyer    14 年前

    约定是将静态媒体放在应用程序中的media/appname/或static/appname/中(类似于模板)。

    对于在项目中使用媒体附带的应用程序,我强烈建议使用 django-staticfiles . 它将通过取代django.views.static.serve的视图自动为开发中的媒体(包括应用程序中的媒体)提供服务,并附带一个构建静态管理命令,将所有应用程序中的媒体复制到一个目录中,以便在生产中使用。

    更新 :django staticfiles具有 become part of Django 1.3 . 它现在期望应用程序媒体位于应用程序的“static/”子目录中,而不是“media/”。管理命令现在是“CollectStatic”。

        2
  •  2
  •   Dominic Rodger    15 年前

    我所知道的唯一一个不需要任何干预就能解决这个问题的应用程序是 django-debug-toolbar 尽管可以说这不是一个很好的例子,因为它是专门为调试模式设计的应用程序。

    它处理它的方式是通过Django本身为媒体服务-见来源 urls.py :

    url(r'^%s/m/(.*)$' % _PREFIX, 'debug_toolbar.views.debug_media'),
    

    一般来说,这是一个坏主意(您不想通过django提供静态文件),根据 this comment from the documentation 以下内容:

    [通过Django提供静态文件]效率低下,而且 不安全的。不要在 生产设置。仅用于 发展。

    显然,django调试工具栏只用于开发,所以我认为它的部署方法是有意义的,但这是非常例外的。

    一般来说,我知道的最好的方法是在媒体存储到应用程序代码中媒体的任何位置创建符号链接。例如,创建一个名为 media 在你的应用中,然后要求用户安装你的应用,要么从他们的媒体目录中添加一个符号链接,要么复制整个内容。

        3
  •  2
  •   jujule    15 年前

    我通常将应用程序媒体放在/apps/appname/static中(我的应用程序驻留在应用程序子文件夹中)

    然后我在Apache的vhost中有类似的东西:

    AliasMatch ^/apps/([^/]+)/static/(.*) /home/django/projectname/apps/$1/static/$2
    <DirectoryMatch "^/home/django/projectname/apps/([^/]+)/static/*">
            Order deny,allow
            Options -Indexes
            deny from all
            Options +FollowSymLinks
            <FilesMatch "\.(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf|txt|htm|html|json)$">
                    allow from all
            </FilesMatch>
    </DirectoryMatch>
    

    我的urls.py for dev server中也有这个(仅用于调试):

    def statics_wrapper(request, **dict):
        from django.views import static
        return static.serve(request, dict['path'], document_root = os.path.join(settings.BASE_DIR, 'apps', dict['app'], 'static'), show_indexes=True)
    urlpatterns += patterns('', (r'^apps/(?P<app>[^/]+)/static/(?P<path>.+)$', statics_wrapper))
    

    这非常方便,因为StaticsURL只是简单地映射到文件系统,例如:

    http://wwww.ecample.com/apps/calendar/static/js/calendar.js 驻留在[base_dir]/apps/calendar/static/js/calendar.js中

    希望这有帮助