【问题标题】:Django 1.4 serving MEDIA_URL and STATIC_URL files on development serverDjango 1.4 在开发服务器上提供 MEDIA_URL 和 STATIC_URL 文件
【发布时间】:2012-12-03 14:15:16
【问题描述】:

刚刚升级到 Django 1.4,并且在开发服务器上对静态和媒体文件的新“改进”服务遇到了严重问题。我喜欢 Django,但是为什么他们现在使用 STATIC_URL、STATIC_ROOT、STATICFILES_DIR 使这些文件的服务变得更加复杂,这完全超出了我的理解。

我只是想在开发服务器上提供所有静态文件和上传文件。经过大量实验,我让 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)

按照文档中的说明添加了两个 conf 设置,第一个用于静态,第二个用于媒体。

我的结构,网站是一个应用程序,并且按照 djangoproject 的说明放置在其中的静态目录:

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

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

{{STATIC_URL}}css/style.css

但是没有提供任何上传的图片,这个使用 photologue 的图片,但 url 是正确的:

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

该目录结构确实存在于 media/ 下

超级,超级困惑。现在这一切看起来都非常复杂,而我以前从未遇到过任何问题。

【问题讨论】:

  • 我知道那种感觉,我只是放弃了,使用 mod_wsgi 和 Apache 来规避 Django 的整个做法。
  • 我应该补充一下,我已经安装了静态文件应用程序并且 DEBUG = True,因为我可以提供静态文件..
  • 应该是urlpatterns += static(... 而不仅仅是加号吗?
  • 将其更改为旧方式,如下面的@username:urlpatterns += (r'^media/(?P.*)$', 'django.views.static.serve ', {'document_root': settings.MEDIA_ROOT}), ) 但仍然没有乐趣。

标签: django


【解决方案1】:

我对 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_APPS

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

【讨论】:

  • 我忘了说这个配置对我在 Webfaction 的生产服务器有效。这就是为什么我包含“if”条件,所以我只需要一个用于开发和生产环境的设置文件
  • 我认为,使用 Django 的服务器在生产服务器上提供静态文件是一个糟糕的选择。它仅用于开发目的。最好将 mod_wsgi 与 Apache 或 Nginx 一起使用,并在其上提供静态文件。你也不需要绝对的 url 定义。
  • 嗨@用户名。我不使用 django 服务器进行生产。此配置在 apache (mod_wsgi) 和 nginx 中用于静态文件。 /static/ 之外的所有内容都由 nginx 处理。绝对网址只是为了清楚
【解决方案2】:

如果您使用 Django 1.4 文件夹结构,您已将 settings.py 移动到新的 website 应用程序文件夹,这意味着您的 MEDIA_ROOT 现在不正确。不确定在这种情况下相对位置是否有效,但应该是这样的

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

使用绝对路径可能更简单。

【讨论】:

  • 不,还没有将 settings.py 移动到网站应用程序中 - 它位于由 startproject 命令设置的 应用程序中。它应该在网站应用程序中吗?
  • 应该在myproject/myproject;这就是 Django 1.4 将其放入新项目的地方。我认为网站是你的“我的项目”应用程序,我很抱歉。答案仍然成立。使用绝对路径有用吗?
  • 我确定你在正确的路线上@Enrico。不过,目前使用绝对路径也不起作用。
【解决方案3】:

我打算先写评论,但不知何故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()

【讨论】:

  • 它是如何工作的 - 你没有用于在“/media”下提供文件的 url conf 设置?服务器如何知道如何处理这些文件?
  • @user1907157 它归结为使用 PROJECT_ROOT 而不是 DIRNAME 设置 MEDIA_ROOT 的用户名。 Settings.py 现在位于项目根目录的子文件夹中,需要相应地更新媒体根目录。看我的回答。
  • @Enrico。你说得对。而我的PROJECT_ROOT 就是这么傻:PROJECT_ROOT = os.path.dirname(os.path.dirname(__file__))
  • @username 在 Django 1.4 中,settings.py 应该在项目应用文件夹中,而不是项目根目录中。 (通过Django 1.4 release notes)
  • @Enrico 我的 settings.py 不在项目根目录中。看结构。这就是我打电话给os.path.dirname 两次的原因。现在我编辑了我的帖子以减少歧义。
猜你喜欢
  • 2012-09-03
  • 2012-01-21
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
  • 2014-03-17
  • 2012-03-01
相关资源
最近更新 更多