2012-12-16 68 views
4

刚刚升级到Django 1.4,并且在开发服务器上静态和媒体文件的“改进”服务方面遇到严重问题。我喜欢Django,但是为什么在STATIC_URL,STATIC_ROOT和STATICFILES_DIR这两个文件更加复杂的情况下,现在完全超越了我。Django 1.4在开发服务器上提供MEDIA_URL和STATIC_URL文件

我只是试图在开发服务器上提供静态和上传的所有文件。经过大量的实验后,我有STATIC_URL文件的工作,但我根本无法获得MEDIA_URL文件。

设置:

DIRNAME = os.path.dirname(__file__) 
MEDIA_ROOT = os.path.join(DIRNAME, 'media/') 
MEDIA_URL = '/media/' 
STATIC_ROOT = '' 
STATIC_URL = '/static/' 
STATICFILES_DIRS =() 

我已经得到了媒体和静态上下文处理器补充说:

TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth", 
"django.core.context_processors.debug", 
"django.core.context_processors.i18n", 
'django.core.context_processors.media', 
'django.core.context_processors.static', 
"django.core.context_processors.request", 
'satchmo_store.shop.context_processors.settings', 
'django.contrib.messages.context_processors.messages', 

,我已经在url confs补充说:

# serve static and uploaded files in DEV 
urlpatterns += staticfiles_urlpatterns() 
urlpatterns + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

with t他在文档中指出了两个conf设置,第一个是静态,第二个是媒体。

我的结构,网站作为一个应用程序和静态目录放在里面的djangoproject的指示:

<myproject> 
    --media 
    --settings 
    --templates 
    --website 
     |->static 

模板,我可以提供静态内容没有问题

{{STATIC_URL}}css/style.css 

但是,任何上传的图片,这一个使用photologue,没有送达,但网址是正确的:

/media/photologue/photos/cache/spawning-2_admin_thumbnail.jpg 

该目录结构确实退出媒体/

超级,超级困惑。这一切现在似乎都非常复杂,而我之前从未遇到任何问题。

+0

我知道这种感觉,我只是放弃了,并使用mod_wsgi和Apache来绕过Django的整个做法。 –

+0

我要补充我已经得到了应用安装和调试=真正的staticfiles,因为我可以提供静态文件.. – professorDante

+0

它应该是'URL模式+ =静态(...'不只是加? – Enrico

回答

2

我对Django很新,我从来没有任何静态内容的问题。

这是我的配置。我希望它可以帮助

我的文件夹结构

django-project 
--mainapp 
----settings.py 
----wsgi.py 
----[...] 
--otherapp 
--fixtures 
--static 
--templates 
--manage.py 
--requirements.txt 

settings.py

import os, socket 

DEBUG = True 
TEMPLATE_DEBUG = DEBUG 
MAIN_APP = os.path.abspath(os.path.dirname(__file__)) 
PROJECT_ROOT = os.path.abspath(os.path.join(MAIN_APP, "..")) 
MY_LOCALHOST = "VirusVault.local" # this is the real name of my local machine :) 

try: HOST_NAME = socket.gethostname() 
except: HOST_NAME = "localhost" 

[...]

if HOST_NAME == MY_LOCALHOST: 
    STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static/') 
    STATIC_URL = "/static/" 
    MEDIA_ROOT = os.path.join(STATIC_ROOT, 'media/') 
    MEDIA_URL = "/media/" 
else: 
    STATIC_ROOT = "/server/path/to/static/files" 
    STATIC_URL = "http://server.com/static/" 
    MEDIA_ROOT = "/server/path/to/static/files/media/" 
    MEDIA_URL = 'http://server.com/static/media/' 

您需要添加'django.contrib.staticfiles'到INSTALLED_AP PS

urls。PY

if settings.HOST_NAME == settings.MY_LOCALHOST: 
    urlpatterns += patterns('', 
     (r'^media/(?P<path>.*)$', 'django.views.static.serve', 
     {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}), 
    ) 
    urlpatterns += patterns('', 
     (r'^static/(?P<path>.*)$', 'django.views.static.serve', 
     {'document_root': settings.STATIC_ROOT, 'show_indexes': True}), 
    ) 
+0

我忘了说这个配置对我在Webfaction的生产服务器是有效的。这就是为什么我将“if”包含在内的原因,所以我只需要一个用于开发和生产环境的设置文件 – xleon

+0

我认为,使用Django的服务器在生产服务器上提供静态文件是一个糟糕的选择。它仅用于开发目的。在Apache或Nginx上最好使用mod_wsgi,并在其上提供静态文件。你也不需要绝对的URL定义。 – username

+0

Hi @username。我不使用django服务器进行生产。这个配置在apache(mod_wsgi)和nginx中用于静态文件。超出/ static /的所有内容都由nginx处理。绝对网址只是为了清晰起见 – xleon

0

我打算先写评论,但不知何故add comment按钮不起作用。

您是否检查媒体目录的权限?

,因为它成为一个答案,我会倾我的工作完美的Django 1.4站点配置之一。

结构:

-myproject 
-- media 
-- static 
-- templates 
-- myproject 
--- settings.py 
--- urls.py 

settings.py:

PROJECT_ROOT = os.path.dirname(os.path.dirname(__file__)) # Not the best way but works 
MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media/') 
MEDIA_URL = '/media/' 
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static/') 
STATIC_URL = '/static/' 

urls.py:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns 
urlpatterns = patterns('', 
... 
(r'^media/(?P<path>.*)$', 'django.views.static.serve', 
    {'document_root': settings.MEDIA_ROOT}), 
) 
urlpatterns += staticfiles_urlpatterns() 
+0

这是如何工作的 - 你没有一个url conf设置来提供'/ media'下的文件?服务器如何知道如何处理这些文件? – professorDante

+0

对不起。我忘了。 – username

+0

@ user1907157它归结为使用PROJECT_ROOT而不是DIRNAME设置MEDIA_ROOT的用户名。 Settings.py现在位于项目根目录的子文件夹中,并且媒体根目录需要相应更新。看到我的答案。 – Enrico

0

如果您正在使用Django 1.4文件夹结构,您已经转移到settings.py您的新website应用文件夹,这意味着您的MEDIA_ROOT现在不正确。不知道相对位置在这种情况下工作,但它应该是这样的

MEDIA_ROOT = os.path.join(DIRNAME, '../media/') 

这可能是简单的使用绝对路径。

+0

不,没有将settings.py移动到网站应用程序中 - 它在应用程序中,由startproject命令设置。它应该在网站应用程序? – professorDante

+0

它应该在myproject/myproject中;这就是Django 1.4在新项目中的地位。我以为网站是你的“myproject”应用程序,我的歉意。答案仍然成立。使用绝对路径工作吗? – Enrico

+0

我相信你在正确的路线@Enrico。尽管目前使用绝对路径并不起作用。 – professorDante

相关问题