不允许在/空静态前缀处配置不当 - Django

Posted

技术标签:

【中文标题】不允许在/空静态前缀处配置不当 - Django【英文标题】:ImproperlyConfigured at / Empty static prefix not permitted - Django 【发布时间】:2014-07-15 11:07:10 【问题描述】:

我正在使用 Django 上传/显示图像。

网站部署在 Heroku 上。

按照this教程,我可以成功上传图片了。

但是,模板中没有显示图像。

然后我了解到我的 urls.py 应该在末尾有这一行:

+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

我将此添加到我的 urls.py 的末尾,但现在我收到此错误:

ImproperlyConfigured at / Empty static prefix not permitted

我的 settings.py 中有 MEDIA_URL 和 MEDIA_ROOT,两者都不是空的。

BASE_DIR = os.path.dirname(os.path.abspath(__file__))

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://example.com/media/", "http://media.example.com/"
MEDIA_URL = '/media/'

为什么会发生这个错误,我该如何解决?

这是我认为我的 urls.py 的相关部分:

from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static
import notifications
admin.autodiscover()

urlpatterns = patterns('',
    ....urls......

) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

【问题讨论】:

...你的MEDIA_URLMEDIA_ROOT 是什么?你说它们是定义的;但它们是什么? 我更新了问题。 static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 仅用于开发,并且仅适用于将debug 设置为True。 docs.djangoproject.com/en/dev/howto/static-files/… 【参考方案1】:

我在我的 urls.py 中添加了相同的行并得到了和你一样的错误。

+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

文档here 说要使用settings.STATIC_URLsettings.STATIC_ROOT

我把它改成了文档版本

urlpatterns = patterns('',
    ....urls......

) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

错误消失了!

我检查了我的设置文件并确保settings.MEDIA_URLsettings.MEDIA_ROOT 都被正确定义。后来我将 urls.py 调整回使用settings.MEDIA_URLsettings.MEDIA_ROOT。一切都按预期进行。

这些是我的 settings.py 文件的相关部分:

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
REPOSITORY_ROOT = os.path.dirname(BASE_DIR)

# Static files (CSS, javascript, Images)
# https://docs.djangoproject.com/en/1.6/howto/static-files/

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(REPOSITORY_ROOT, 'static/')

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

我认为MEDIA_URL 设置不正确

【讨论】:

谢谢,德文!对我来说,这显然是缺少 MEDIA_ROOT 的错。 url 模式仍然可以在方括号内。【参考方案2】:

您还必须检查 MEDIA_URL 和 MEDIA_ROOT 以及静态文件 STATIC_ROOT STATIC_URL 是否正确定义。

还要检查正确的拼写:)

如果其中一个未配置,则会导致此错误。

【讨论】:

【参考方案3】:

要解决此问题,必须将以下语句添加到 settings.py 文件中:

MEDIA_URL = '/media/'

MEDIA_ROOT = os.path.join(BASE_DIR, "media")

【讨论】:

欢迎来到 SO 并感谢您的贡献。如果您添加更具体的解释(例如背景信息、它的作用、为什么它有助于解决给定的问题),它将有助于其他人和 OP 理解您的解决方案。【参考方案4】:

确保 settings.py 有:

# Media

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

然后在 urls.py 中,试试这个

urlpatterns[
    ...
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL,
                          document_root=settings.MEDIA_ROOT)

【讨论】:

【参考方案5】:

以防万一您遇到此问题,请确保您同时设置了 MEDIA_URL 和 MEDIA_ROOT。

我收到了错误

ImproperlyConfigured at / Empty static prefix not permitted

当我只在 django 1.11 中设置 MEDIA_ROOT 时

另外,django 项目 wiki 说它不能在调试模式下引用 URL: https://docs.djangoproject.com/en/1.11/howto/static-files/#serving-files-uploaded-by-a-user-during-development

【讨论】:

【参考方案6】:

我正在关注Django 2.2 & Python | The Ultimate Web Development Bootcamp 我的问题是我忘记将这些声明到portfolio-project/portfolio/settings.py/ 到底部区域:

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/
STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/Media/'

【讨论】:

【参考方案7】:

我最近在使用 Django 2.1 时遇到了同样的错误问题是我没有在项目设置文件中明确指定 MEDIA_URL = '/media/'。一旦我声明相同,错误就消失了。

【讨论】:

【参考方案8】:

要修复此错误,我必须将 STATIC_ROOTSTATIC_URL 放在 STATICFILES_DIRS 声明之上。

【讨论】:

以上是关于不允许在/空静态前缀处配置不当 - Django的主要内容,如果未能解决你的问题,请参考以下文章

在特定路由前缀处配置 OWIN 静态文件服务器

配置不当的静态文件

Django的静态文件的配置

当静态文件的realative引用不包含'static'时,如何在Django中配置设置?

Django之orm

Django 之 orm操作