2010-01-14 95 views
13

背景:Django应用程序应如何捆绑静态媒体?

我开始使用Django的第一次,这也是我第一次涉足网络开发。我只是陷入了整个“服务静态媒体”的问题。花了一段时间查看所有文档和StackOverflow问题后,我想我理解它应该如何工作(即MEDIA_ROOT,MEDIA_URL,更新URL文件等)。

我的问题

好了,这里是我不知道的部分。 Django应用程序应该是“可插入的”,即我可以将应用程序从一个项目移动到另一个项目。那么,这些应用程序应该如何捆绑静态媒体?

例如,假设我有一个“foo”应用程序,它具有加载一些css /图像文件的模板。我应该在哪里放置这些文件,以便在包含应用程序后自动获得服务?

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

这是接受的方式吗?它包括一个额外的步骤,但也许这是处理web-dev时的标准(我是新的,所以我不知道)。

另外,如果是这样,是否有一个标准的方法来收集我所有的静态媒体,以便知道我需要提供哪些服务? (也就是说,在应用程序中有一个名为“media”或文件夹的标准文件夹?)。

感谢,

回答

9

公约是把静态的媒体无论是媒体/应用程序的名字/或静态/ APPNAME /应用(类似于模板)内。

对于在您的项目中使用媒体附带的应用程序,我强烈建议使用django-staticfiles。它将通过替代django.views.static.serve的视图自动为媒体(包括应用内的媒体)提供开发服务,并且它提供了build_static管理命令,可将所有应用中的媒体复制到单个目录中以便在生产环境中投放。

更新:django-staticfiles有become part of Django 1.3。它现在期望应用媒体生活在应用的“静态/”子目录中,而不是“媒体/”。而管理层的命令现在是“沉静的”。

+0

从Django 1.3开始,这是现在正确的方法。 – 2012-04-07 08:20:02

+1

请注意,https://github.com/jaddison/django-cachebuster/为Django 1.3提供了非常有用的{%static%}标记 – Eli 2012-07-30 15:27:55

2

我所知道的是,唯一的应用程序与此交易没有任何干预是相当美好的django-debug-toolbar,虽然这是值得商榷的,这不是一个很好的例子,因为它是一个应用程序专为调试模式设计只要。

它与它交易的方式是,通过Django的服务于其媒体 - 看到源urls.py

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

总的来说,这是一个坏主意(你不想为静态通过Django的文件),每this comment from the documentation

[通过Django的服务静态文件]是低效和 不安全。不要在 生产设置中使用此功能。仅在 开发中使用此项。

显然,django-debug-toolbar只用于开发,所以我认为它的部署方法很有意义,但这是一个例外。

一般来说,我知道这样做的最佳方式是创建符号链接,无论媒体存储在应用程序代码中的媒体中。例如,在您的应用程序中创建一个名为media的文件夹,然后要求安装您应用程序的用户从其媒体目录添加符号链接,或者复制整个文件夹。

+0

我应该如何避免命名冲突/在我的代码中引用它?如果我有一个带媒体文件夹的“foo”应用程序和一个带有媒体文件夹的“bar”应用程序,那么如何在应用程序模板内引用该文件夹而不会导致问题? – 2010-01-14 14:19:33

+1

如果您的应用名为foobar,请使用{{MEDIA_URL}} foobar/myawesomejs.js'查看您的媒体。要求你的用户在他们的媒体目录中设置'foobar'的符号链接。 – 2010-01-14 14:34:41

+0

我认为我的答案如下(使用django-staticfiles)是一个更好的全面解决方案;特别是因为它看起来像基于静态文件的东西可能直接包含在Django 1.3中。 – 2010-06-21 21:01:16

2

我通常会把应用媒体放进去。/应用程序/应用程序的名字/静态的(我的应用程序驻留在应用程序的子文件夹)

然后我有阿帕奇在虚拟主机类似的东西:

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 dev的服务器(只能使用调试):

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)) 

这是非常方便的,因为静态URL只是映射到文件系统,如:

http://wwww.ecample.com/apps/calendar/static/js/calendar.js驻留在[BASE_DIR] /应用/ calend AR /静态/ JS/calendar.js

希望这有助于

相关问题