从 Django 静态文件夹中获取图像的正确方法

Posted

技术标签:

【中文标题】从 Django 静态文件夹中获取图像的正确方法【英文标题】:Proper way to get images from Django static folder 【发布时间】:2019-04-16 03:56:32 【问题描述】:

在我的 setting.py 中,我有下一个代码:

STATICFILES_FINDERS = [
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]

STATICFILES_DIRS = [
    os.path.join(PROJECT_DIR, 'static'),
]

STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

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

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

在views.py中,我想获取静态文件夹中的一些图片,如下所示:

for f in ["static/img/logo/contact-form/logo_black.png", "static/img/logo/contact-form/logo_white.png":
    fp = open(os.path.join(BASE_DIR, f), 'rb')
    msg_img = MIMEImage(fp.read())
    fp.close()
    msg_img.add_header('Content-ID', '<>'.format(f))
    msg.attach(msg_img)

但我收到一个错误:

"[Errno 2] No such file or directory: '/Users/Admin/Projects/web-dealers/webDealers/static/img/logo/contact-form/logo-black.png'"

更新

urls.py如下:

urlpatterns = [
    url(r'^django-admin/', admin.site.urls),

    url(r'^admin/', include(wagtailadmin_urls)),
    url(r'^documents/', include(wagtaildocs_urls)),

    url(r'^search/$', search_views.search, name='search'),
    url(r'^api/', include('API.urls')),
    url(r'^contact-us/', contact_us, name="contact_us"),

    # Languages
    url(r'^i18n/', include('django.conf.urls.i18n'), name='set_language'),
    url(r'^jsi18n/$', javascriptCatalog.as_view(), name='javascript-catalog'),

    # For anything not caught by a more specific rule above, hand over to
    # Wagtail's page serving mechanism. This should be the last pattern in
    # the list:
    url(r'', include(wagtail_urls)),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

我做错了什么?

【问题讨论】:

您需要在 url 中定义它们才能访问它们,或者使用 nginx 或 Apache 等外部服务来为它们提供服务 @ruddra 检查更新的问题。它们在 urls 中定义。 在视图中引用静态文件可能有问题。查看this question 讨论如何在视图中使用静态文件。 什么是“其余代码”?特别是,您是如何打开这些文件的? @DanielRoseman 我已经更新了我的问题 【参考方案1】:

django 中的静态总是很棘手而且很麻烦。我不知道为什么:)你没有DEBUG=False而忘了做python manage.py collectstatic吗?

但是,这对我有用:

settings.py:

INSTALLED_APPS = [
    ...some other applications....

    'django.contrib.staticfiles',

    ...some other applications....

]

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

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

我在urls.py 中没有任何内容。我可以正常访问静态文件,例如: localhost:8000/static/image.png.

编辑:

似乎我没有正确阅读并回答了不同的问题:)您的问题不是在静态文件服务期间,而是在您在后端内部访问时。它说:找不到文件。你确定路径是正确的吗?或者,os.path.join(BASE_DIR', 'static') 真的包含该文件?您尝试使用绝对路径访问文件,因此它必须易于验证它是否存在于:

'/Users/Admin/Projects/web-dealers/webDealers/static/img/logo/contact-form/logo-black.png'

【讨论】:

以上是关于从 Django 静态文件夹中获取图像的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

调试模式打开时的 Django 和静态文件

[Django] [channels] [python]如何上传静态文件(图像,文档)?

在 Heroku 上部署 Django/静态文件的正确方法

Django 获取静态媒体文件

Django静态图像文件无法加载资源

如何返回通过django中的视图的静态文件?