Django:静态图像不会加载
Django: Static Image won't load
我一直在严格按照官方文档进行操作,在这里尝试了一些相关问题的建议,并且只是在网上搜索一般,但我仍然没有运气来加载一张小图片。
我有一个名为 'logo.png' 的图像,我的项目层次结构如下所示:
project/
mysite/
app/
__init__.py
admin.py
models.py
urls.py
view.py
mysite/
__init__.py
settings.py
urls.py
views.py
wsgi.py
static/
logo.png
templates/
index.html
calling_image.html
里面settings.py
我有STATIC_URL = '/static/'
里面calling_image.html
我有<img src="/static/logo.png">
我的模板 calling_image.html
由 project/mysite/app/views.py
调用,然后由 project/mysite/app/urls.py
调用,我什至尝试包括以下两行(正如我多次看到的建议) 在我的 urls.py
:
结尾
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()
没有任何效果,我做错了什么?
编辑:抱歉,我做了一个类型,我的 settings.py
中有 STATIC_URL = '/static/'
和结束斜杠,为了澄清,我是 运行 这在我的开发版本中 python manage.py runserver
已解决:所以我最终自己解决了这个问题。我在 project/mysite/
中创建了一个目录 resources
并将 logo.png
放在那里。然后我设置 STATICFILES_DIRS = (os.path.join(BASE_DIR, "resources"),)
和 运行 collecstatic
一切正常!不需要使用 urlpatterns += staticfiles_urlpatterns()
和诸如此类的东西。
如果我记得,您需要在 settings.py
中指定 STATIC_ROOT = 'static'
并且您需要有一个 URL 来将 /static
指向您的静态文件。像这样。
urlpatterns += patterns('',
(r'^static/(?P<path>.*)$', 'django.views.static.serve', {
'document_root': settings.STATIC_ROOT, 'show_indexes': True
}),
)
这可能有点过时,但对我来说仍然有效。
此外,您是想让它在您的 python manage.py runserver
开发站点上运行还是在生产站点上运行?
更新
这是您的主要 urls.py 文件的示例。
from django.conf.urls import patterns, include, url
urlpatterns = (
url(r'^admin/', include(admin.site.urls)),
# more urls...
)
#The following enable structural 'static' files while in development mode.
if settings.DEBUG:
urlpatterns += patterns('',
(r'^static/(?P<path>.*)$', 'django.views.static.serve', {
'document_root': settings.STATIC_ROOT, 'show_indexes': True
}),
)
patterns
被导入到 urls.py 文件的顶部附近。
这是 STATIC_ROOT
发挥作用的地方。
您可能还需要 运行 python manage.py collectstatic
以便从您的各种应用程序收集静态文件并将其复制到 STATIC_ROOT
.[=21= 的文件夹中]
有关更深入的解释,请参阅 this answer:)
看起来您可能需要在您的 settings.py 中定义的变量 STATICFILES_DIRS
,它应该包括 static
目录的位置 logo.png
.
默认情况下,Django 仅在 每个应用程序 内的 static
目录中查找静态文件。如果您在任何应用程序之外有一个静态文件,collectstatic
不会自动选取它。
见https://docs.djangoproject.com/en/1.8/ref/settings/#std:setting-STATICFILES_DIRS
静态文件混乱
关于 Django 和静态文件总是存在很多混淆。我相信这种混淆来自这样一个事实,即 Django 在 production 中处理静态文件没有任何意义,但在学习使用 Django 时使用它似乎很自然,因此当初步发展。
Django 提供静态文件没有任何意义的原因是 Django 是一个呈现动态响应 的框架。 "Static" 文件不是动态的:它们不会改变。因此,启动一个 Python 应用程序是一种巨大的资源浪费,它会调用所有 Django 机器,只是为了找到 return 一个没有动态内容的文件。
静态文件:网络服务器的工作
有一些东西非常擅长提供静态文件:网络服务器本身(例如 Apache、nginx 等)。这就是他们设计的目的。网络服务器可以 运行 一个 Python/Django 应用程序 或 它只能找到一个文件并将其发回,因此您通常通过告诉它类似以下内容来配置网络服务器(用伪服务器语言):
When someone accesses the path /static/
let them access the files in
the following directory: /var/www/static/
.
When someone accesses the
path /
, spin up this Python application that lives over here:
/var/www/django-app
.
Django 静态文件工具
因此,Django 附带了一些管理静态文件的辅助工具,以便您的实际服务器可以为它们提供服务。
这些工具如下(在settings.py
中定义):
STATIC_URL
:URL 服务器将为您提供服务的路径
静态文件。这只是为了当您使用 static
模板标签时,Django 知道如何 urlreverse
它。换句话说,它只是将 {% static "..." %}
转换为 /static/...
. 的一种简便方法
STATIC_ROOT
:您服务器上的位置(或在
cloud somewhere),Django 将向其中复制 你的静态文件,所以
您的服务器可以为他们提供服务。此复制发生在您 运行
collectstatic
。
STATICFILES_DIRS
: 任何额外的目录 Django
每当您 运行 collectstatic
时,都应该查找静态文件。经过
默认 Django 只在每个应用程序的目录中查找 static
目录(就像 templates
)。
开发中的静态文件
好的,但这对您可能使用 Django 的 runserver
命令的开发没有太大帮助。您没有服务器 运行ning 来处理静态文件。
因此,在这种情况下,您可以要求 Django 也为您提供服务器静态文件,因为您正在开发您的应用程序并且不想运行 一个单独的服务器。
is a view 应该会在 DEBUG=True
时自动获取和提供静态文件。或者,这也是为什么有人可能会使用以下内容的原因:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()
- 确保
django.contrib.staticfiles
包含在您的 INSTALLED_APPS
中。
- 在您的设置文件中,定义 STATIC_URL,例如:
STATIC_URL = 'static/'
- 希望您将图像存储在文件夹
projectname/static/appname/images/image.png
- 最后在您的 html 中添加以下内容
<img src="appname/images/image.png" alt="My image"/>
我什么都试过了,都没用。最后发现图像已损坏,因为我在 Visual Code 编辑器中将其作为字节打开。
已上传新图片,一切正常。
我一直在严格按照官方文档进行操作,在这里尝试了一些相关问题的建议,并且只是在网上搜索一般,但我仍然没有运气来加载一张小图片。
我有一个名为 'logo.png' 的图像,我的项目层次结构如下所示:
project/
mysite/
app/
__init__.py
admin.py
models.py
urls.py
view.py
mysite/
__init__.py
settings.py
urls.py
views.py
wsgi.py
static/
logo.png
templates/
index.html
calling_image.html
里面settings.py
我有STATIC_URL = '/static/'
里面calling_image.html
我有<img src="/static/logo.png">
我的模板 calling_image.html
由 project/mysite/app/views.py
调用,然后由 project/mysite/app/urls.py
调用,我什至尝试包括以下两行(正如我多次看到的建议) 在我的 urls.py
:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()
没有任何效果,我做错了什么?
编辑:抱歉,我做了一个类型,我的 settings.py
中有 STATIC_URL = '/static/'
和结束斜杠,为了澄清,我是 运行 这在我的开发版本中 python manage.py runserver
已解决:所以我最终自己解决了这个问题。我在 project/mysite/
中创建了一个目录 resources
并将 logo.png
放在那里。然后我设置 STATICFILES_DIRS = (os.path.join(BASE_DIR, "resources"),)
和 运行 collecstatic
一切正常!不需要使用 urlpatterns += staticfiles_urlpatterns()
和诸如此类的东西。
如果我记得,您需要在 settings.py
中指定 STATIC_ROOT = 'static'
并且您需要有一个 URL 来将 /static
指向您的静态文件。像这样。
urlpatterns += patterns('',
(r'^static/(?P<path>.*)$', 'django.views.static.serve', {
'document_root': settings.STATIC_ROOT, 'show_indexes': True
}),
)
这可能有点过时,但对我来说仍然有效。
此外,您是想让它在您的 python manage.py runserver
开发站点上运行还是在生产站点上运行?
更新
这是您的主要 urls.py 文件的示例。
from django.conf.urls import patterns, include, url
urlpatterns = (
url(r'^admin/', include(admin.site.urls)),
# more urls...
)
#The following enable structural 'static' files while in development mode.
if settings.DEBUG:
urlpatterns += patterns('',
(r'^static/(?P<path>.*)$', 'django.views.static.serve', {
'document_root': settings.STATIC_ROOT, 'show_indexes': True
}),
)
patterns
被导入到 urls.py 文件的顶部附近。
这是 STATIC_ROOT
发挥作用的地方。
您可能还需要 运行 python manage.py collectstatic
以便从您的各种应用程序收集静态文件并将其复制到 STATIC_ROOT
.[=21= 的文件夹中]
有关更深入的解释,请参阅 this answer:)
看起来您可能需要在您的 settings.py 中定义的变量 STATICFILES_DIRS
,它应该包括 static
目录的位置 logo.png
.
默认情况下,Django 仅在 每个应用程序 内的 static
目录中查找静态文件。如果您在任何应用程序之外有一个静态文件,collectstatic
不会自动选取它。
见https://docs.djangoproject.com/en/1.8/ref/settings/#std:setting-STATICFILES_DIRS
静态文件混乱
关于 Django 和静态文件总是存在很多混淆。我相信这种混淆来自这样一个事实,即 Django 在 production 中处理静态文件没有任何意义,但在学习使用 Django 时使用它似乎很自然,因此当初步发展。
Django 提供静态文件没有任何意义的原因是 Django 是一个呈现动态响应 的框架。 "Static" 文件不是动态的:它们不会改变。因此,启动一个 Python 应用程序是一种巨大的资源浪费,它会调用所有 Django 机器,只是为了找到 return 一个没有动态内容的文件。
静态文件:网络服务器的工作
有一些东西非常擅长提供静态文件:网络服务器本身(例如 Apache、nginx 等)。这就是他们设计的目的。网络服务器可以 运行 一个 Python/Django 应用程序 或 它只能找到一个文件并将其发回,因此您通常通过告诉它类似以下内容来配置网络服务器(用伪服务器语言):
When someone accesses the path
/static/
let them access the files in the following directory:/var/www/static/
.When someone accesses the path
/
, spin up this Python application that lives over here:/var/www/django-app
.
Django 静态文件工具
因此,Django 附带了一些管理静态文件的辅助工具,以便您的实际服务器可以为它们提供服务。
这些工具如下(在settings.py
中定义):
STATIC_URL
:URL 服务器将为您提供服务的路径 静态文件。这只是为了当您使用static
模板标签时,Django 知道如何urlreverse
它。换句话说,它只是将{% static "..." %}
转换为/static/...
. 的一种简便方法
STATIC_ROOT
:您服务器上的位置(或在 cloud somewhere),Django 将向其中复制 你的静态文件,所以 您的服务器可以为他们提供服务。此复制发生在您 运行collectstatic
。STATICFILES_DIRS
: 任何额外的目录 Django 每当您 运行collectstatic
时,都应该查找静态文件。经过 默认 Django 只在每个应用程序的目录中查找static
目录(就像templates
)。
开发中的静态文件
好的,但这对您可能使用 Django 的 runserver
命令的开发没有太大帮助。您没有服务器 运行ning 来处理静态文件。
因此,在这种情况下,您可以要求 Django 也为您提供服务器静态文件,因为您正在开发您的应用程序并且不想运行 一个单独的服务器。
is a view 应该会在 DEBUG=True
时自动获取和提供静态文件。或者,这也是为什么有人可能会使用以下内容的原因:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()
- 确保
django.contrib.staticfiles
包含在您的INSTALLED_APPS
中。 - 在您的设置文件中,定义 STATIC_URL,例如:
STATIC_URL = 'static/'
- 希望您将图像存储在文件夹
projectname/static/appname/images/image.png
- 最后在您的 html 中添加以下内容
<img src="appname/images/image.png" alt="My image"/>
我什么都试过了,都没用。最后发现图像已损坏,因为我在 Visual Code 编辑器中将其作为字节打开。
已上传新图片,一切正常。