Django静态文件404
Posted
技术标签:
【中文标题】Django静态文件404【英文标题】:Django Static files 404 【发布时间】:2012-09-30 08:07:09 【问题描述】:我无法启动我的静态文件。我已经尝试了各种设置和目录配置等,但它们只是显示为 404。我已经安装了 debug_toolbar,所以知道 STATIC_URL 正在到达我的请求上下文。
显示 /static 的目录结构(我还把目录放在了饭菜应用文件夹和用户中,只是为了尝试一下。
/mealmate
/mealmate
/meals
/static
/css
/bootstrap.min.css
/templates
/users
Settings.py(一些重要的设置,尽管我已经尝试过其他各种设置):
MEDIA_ROOT = os.path.join(PROJECT_PATH, 'media/')
STATIC_URL = '/static/'
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
)
WSGI_APPLICATION = 'mealmate.wsgi.application'
在base.html中渲染
<link rel="stylesheet" href="/static/css/bootstrap.min.css">
有什么想法吗? 谢谢
【问题讨论】:
如果我手动生成了静态文件夹,为什么还需要运行 collectstatic?无论如何我做了,但它仍然没有工作。尽管进行了设置,Django 仍无法识别我的静态文件夹。 试试:python manage.py findstatic --verbosity 2 css/styles.css
看看 Django 在哪里寻找你的静态文件。
@deed02392 我知道这是很久以后的事了,但是谢谢,我不知道为什么我的不工作。无论我如何尝试在我的设置中更改STATIC_URL
,它都不起作用。然后那个命令帮我找到位置,我不知道为什么它不会改变
很高兴它帮助了@Amon,它也是帮助我弄清楚发生了什么的关键命令
【参考方案1】:
这是 django for windows 中静态/媒体/模板访问的有效解决方案,
settings.py
import os.path
STATIC_ROOT = ''
STATIC_URL = '/static/'
STATICFILES_DIRS = ( os.path.join('static'), )
【讨论】:
谢谢,太好了!有关更多信息,您可以关注 blog.xjtian.com/post/52685286308/… 这个博客,非常实用的描述如何在 django 中使用静态服务。os.path.join('static')
给出简单的'static'
这对我也有帮助。为了更具体地确定我的问题,我的 join() 字符串中有一个前导“/”。
STATIC_ROOT
规范不是必需的。而且,正如@SławomirLenart 指出的那样,您可以摆脱join
并只使用字符串。
@cirrusio STATIC_ROOT 实际上是我所需要的。我正在按照教程进行操作,但无法加载静态文件。我只是添加了 STATIC_ROOT = '' 行,它就开始工作了。我不需要任何其他更改。【参考方案2】:
对我来说,这是由于在settings.py
中将 debug 设置为 false 造成的。一种解决方法是将--insecure
开关传递给runserver
,但真正的解决方案是使用适当的Web 服务器来提供静态文件。有关详细信息,请参阅this question 的答案。
【讨论】:
老兄。经过几个小时的尝试,这解决了这个问题。谢谢 谢谢++我快疯了。 这个!非常感谢,几乎疯狂地调试我的静态文件... yyyuuup。可以在生产服务器上运行,但我的一位开发人员在 Windows 上的本地运行服务器上遇到问题。事实证明需要在本地启用调试 :-) 谢谢! :-) 这个问题有多傻?在对生产进行一些更改并设置 Debug = False 后,我的开发环境突然停止提供静态文件,我花了好几个小时才找到这个解决方案。这应该记录在某处或在日志中给出明确的警告。【参考方案3】:如果您在 Web 服务器上运行此程序,您是否将静态文件复制到公共可访问文件夹?例如:
# web accessible folder
STATIC_ROOT = '/home/your_name/www/mealmate/static/'
# URL prefix for static files.
STATIC_URL = '/static/'
# Additional locations of static files
STATICFILES_DIRS = (
# location of your application, should not be public web accessible
'/home/your_name/website/mealmate/static',
)
# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
然后您可以使用这篇帖子Django static Files 并使用manage.py 将静态文件复制到公共可访问文件夹
# --link Create a symbolic link to each file instead of copying.
# --noinput Do NOT prompt the user for input of any kind.
#
python manage.py collectstatic -link --noinput
希望有帮助!
【讨论】:
URI 是否有意不同? (www
vs website
)?
@Rikki 是的,以表明您可以添加其他静态文件目录。 Django 将捆绑这些目录中的所有文件并复制到STATIC_ROOT
【参考方案4】:
从上面的 cmets - 运行这个
python manage.py findstatic --verbosity 2 css/styles.css
找不到与“css/styles.css”匹配的文件。
查看以下位置: /Users/yourname/Documents/Workspace/test/staticfiles
我只是将我的 static 文件夹重命名为 staticfiles,一切都很好。 (我在 osx + django 1.x 上)
如果您在本地开发盒上,使用不安全模式可能不会受到伤害 - 否则您可能仍然会收到 404 错误。
python manage.py runserver --insecure
更新
实际上是在settings.py中挖掘发现了侵权行。
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'staticfiles'),
)
【讨论】:
【参考方案5】:如果您最近在设置文件中将调试更改为 false。遵循此程序。
大部分时间是由settings.py中的debug设置为假造成的。如果您将 --insecure 开关传递给 runserver 它应该可以工作。因此,如果您使用python manage.py runserver 0.0.0.0:8000
,请将其改为python manage.py runserver 0.0.0.0:8000 --insecure
。
它应该可以工作。
【讨论】:
通过阅读我正在接受的文档,django 将在开发模式下提供静态数据。另一方面,对于开发模式关闭,您应该真正使用 nginx,因为 django 提供静态服务效率低下。上面的标志表示您承认这一事实。【参考方案6】:我只是添加了等价的
STATICFILES_DIRS = (
'/absolute_path_to_project/mealmate/static',
)
让这个工作。当然,请将absolute_path_to_project
替换为您的实际路径,并在必要时添加驱动器号。
【讨论】:
【参考方案7】:我也陷入了 404 问题,直到我意识到 Apache 阻止了对静态目录的请求。我使用python manage.py collectstatic
将所有静态文件复制到我的项目根目录下的static 目录,即/var/my/site/static。与
Alias /static /var/my/site/static
<Directory /var/my/site/static>
Require all granted
</Directory>
在/etc/httpd/conf/httpd.conf中,现在可以正常使用了。
如果以上答案都不起作用,您可以考虑检查您的服务器配置。
【讨论】:
我将别名设置为Alias /static/ /var/my/site/static
,因为它在docs.djangoproject.com/en/1.11/howto/deployment/wsgi/modwsgi/… 上,并将第一次调用更改为/static
为我解决了这个问题。谢谢!【参考方案8】:
就我而言,我所要做的就是重新运行服务器:
python manage.py runserver
【讨论】:
【参考方案9】:我假设你在这里使用的是 Django1.3+。
首先,您需要定义更多设置:
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]
STATICFILES_DIRS = [
path.join(TOP_DIR, 'static'),
]
STATIC_ROOT = path.join(TOP_DIR, 'staticfiles')
STATIC_URL = '/static/'
这应该可以帮助您找到该目录。
此外,您应该始终使用STATIC URL
访问您的静态文件:
<link rel="stylesheet" href=" STATIC_URL css/bootstrap.min.css">
【讨论】:
嗨,我正在使用 STATIC_URL 。有点不清楚,我展示的 html 是渲染文件,以证明标签正在工作。我在本地工作,所以我认为只需要一个 STATIC_URL 设置,只要 /static 目录就位。【参考方案10】:确保食客在您的 INSTALLED_APPS 中
【讨论】:
【参考方案11】:在setting.py
下面添加
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
【讨论】:
【参考方案12】:在 Django 中,您的模板还有一个优势,那就是您可以像这样链接静态数据,也许这就是您的问题!
<script src="% static 'myapp/bootstrap.min.js' %"></script>
<link href="% static 'myapp/bootstrap.css' %" rel="stylesheet" type="text/css"/>
更好用
% static '文件名' %
而且它也更容易 想了解更多,我参考https://docs.djangoproject.com/en/1.11/intro/tutorial06/
【讨论】:
【参考方案13】:在我的情况下,我的静态文件位于resources/static
目录中,我在settings.py
文件中设置了一些设置:
STATICFILES_DIRS = (
os.path.join(BASE_DIR, './resources/static/'),
)
并像这样在我的模板中使用它:
% load static %
<link rel="stylesheet" type="text/css" href="% static '/plugins/bootstrap/css/bootstrap.css' %">
这种方法对我有用。
【讨论】:
【参考方案14】:将以下行插入项目主文件夹的 settings.py 中:
STATIC_ROOT = ''
STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join('static'))
然后,在html文件中插入:
% load static %
最后,在settings.py中,将django.contrib.staticfiles
添加到INSTALLED_APPS = [...]
中
【讨论】:
【参考方案15】:在您的设置中将 DEBUG 变量更改为 True。
如果启用了调试,runserver 方法只会查找静态数据,如果没有,它将在 STATIC_ROOT url 中查找
【讨论】:
【参考方案16】:如果您遇到此错误,请首先检查调试的真假,以及您是否同时使用“STATIC_ROOT”和“STATICFILES_DIRS”
对于我的情况,我在 settings.py 中使用了以下内容:
import os (You have to import os at first)
#(If the app is in production mode then False. By default True)
DEBUG = False
#(If debug is false then add allowed hosts)
ALLOWED_HOSTS = ['*']
#(Built in)
STATIC_URL = '/static/'
STATIC_ROOT = 'static' (You have to add it to the code)
STATICFILES_DIRS = [ os.path.join(BASE_DIR, '/static') ] (You have to add it to the code)
【讨论】:
【参考方案17】:我认为您错过了将应用 INSTALLED_APPS 放入您的 settings.py 文件中,您应该添加“mealmate”
INSTALLED_APPS = (
'mealmate',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
)
之后静态和命令文件将对 django 可见。我在使用命令时遇到问题,这就是我修复它的方式。
【讨论】:
【参考方案18】:在 Cpanel 上这是一个很好的解决方案 here
在 cpanel 的终端上安装 dj-static static3
pip install dj-static static3
然后在 wsgi.py 中替换这段代码 py 应用程序
from dj_static import Cling
application = Cling(get_wsgi_application())
【讨论】:
【参考方案19】:我遇到了同样的问题。这里我如何解决访问模板中的静态文件。
我的 Django 项目(Recognition/)文件目录如下:
/media
/1
i1.jpg
i2.jpg
....
/static
/css
/op.css
/img
/emoji.png
/Recognition
...
/settings.py
/urls.py
...
/uploader
...
/urls.py
/templates
/uploader
/create.html
...
我的 settings.py 如下所示:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'Recognition',
'uploader',
]
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
我的 (Recognition/urls.py) 看起来像这样:
urlpatterns = [
path('admin/', admin.site.urls),
...
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
然后我访问模板(create.html)中的所有静态文件和媒体文件,如下所示: 这是示例代码
<!DOCTYPE html>
<html>
<head>
% block extrahead %
<link rel="stylesheet" type="text/css" href="static/css/op.css">
% endblock %
</head>
<style type="text/css">
.notfound .notfound-404
...
background-image: url('static/img/emoji.png');
...
<style>
<body>
<img src=" MEDIA_ROOT /media/i1.jpg" class="image_responsive" >
</body>
或
你可以使用这个 django 命令来查看 django 在哪里看到你的静态文件。 SOURCE
python manage.py collectstatic --help
【讨论】:
【参考方案20】:对我来说,我除了运行 manage.py runserver myip:port 什么都不做。然后我关闭它并重新启动uwsgi,静态文件加载成功。我不知道为什么,但它对我有用......
【讨论】:
【参考方案21】:我能够通过将 js 文件名从骆驼大小写更改为蛇大小写来解决同样的问题。
【讨论】:
以上是关于Django静态文件404的主要内容,如果未能解决你的问题,请参考以下文章