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

Python Django应用程序应该如何捆绑静态媒体?,python,django,web-applications,Python,Django,Web Applications,背景: 我第一次开始使用Django,这也是我第一次涉足web开发。我只是被整个“服务静态媒体”的问题困住了。在花了一段时间查看所有文档和StackOverflow问题之后,我想我理解了它应该如何工作(即MEDIA_ROOT、MEDIA_URL、更新URL文件等) 我的问题: 好的,这是我不确定的部分。Django应用程序应该是“可插入的”,也就是说,我可以将一个应用程序从一个项目移动到另一个项目。那么,这些应用程序应该如何捆绑静态介质呢 例如,假设我有一个“foo”应用程序,它有一些加载css

背景:

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

我的问题

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

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

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

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

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


谢谢,

据我所知,唯一一款不需要任何干预就能解决这个问题的应用程序是非常棒的,尽管这不是一个很好的例子是有争议的,因为它是专门为调试模式设计的应用程序

它的处理方式是通过Django本身为其媒体提供服务-请参阅来源:

通常,这是一个坏主意(您不希望通过Django提供静态文件),根据:

[通过Django提供静态文件]效率低下且 不安全的。不要在一个特殊的环境中使用这个 生产环境。仅用于 发展

显然,django调试工具栏仅用于开发,因此我认为它的部署方法是有意义的,但这是一个非常例外的情况


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

我通常将应用程序媒体放入./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>
AliasMatch^/apps/([^/]+)/static/(.*)/home/django/projectname/apps/$1/static/$2
命令拒绝,允许
选项-索引
全盘否定
选项+FollowSymLinks
通融
我的urls.py for dev服务器中也有这个(仅用于调试):

def statics\u包装(请求,**dict):
从django.views导入静态
返回static.service(请求,dict['path'],document_root=os.path.join(settings.BASE_DIR,'apps',dict['app'],'static'),show_index=True)
urlpatterns+=模式(“”,(r'^apps/(?P位于[BASE_DIR]/apps/calendar/static/js/calendar.js中


希望这有帮助

惯例是将静态媒体放入应用程序中的media/appname/或static/appname/(类似于模板)

对于在项目中使用媒体附带的应用程序,我强烈建议使用。它将自动为媒体服务(包括应用程序中的媒体)通过替换django.views.static.service的视图进行开发,它附带一个build_static management命令,该命令将所有应用程序中的媒体复制到一个目录中,以便在生产中提供服务


更新:django staticfiles有。它现在希望应用程序媒体位于应用程序的“static/”子目录中,而不是“media/”。管理命令现在是“collectstatic”。

我应该如何避免命名冲突/在代码中引用它?如果我有一个“foo”应用程序,其中有一个媒体文件夹和一个“bar”如果你的应用程序名为
foobar
,请使用
{media\u URL}引用你的媒体foobar/myawesomejs.js
。要求用户在其媒体目录中的
foobar
处设置符号链接。我认为我的答案如下(使用django静态文件)是一个更好的全面解决方案;特别是因为它看起来像是基于静态文件的东西,可能直接包含在Django 1.3中。@Carl-你有Django 1.3评论的来源吗?毫无疑问-只是在努力寻找我感兴趣的1.3的概述。@Dominic-看看这个Django开发者线程:a下面是Django核心开发人员(Django staticfiles的作者)开始的工作:注意,它为Django 1.3提供了非常有用的{%static%}标记
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>
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))