Django静态文件404


78

我无法显示我的静态文件。我尝试了各种设置和目录配置等,但是它们只是显示为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">

有任何想法吗?谢谢


7
如果手动生成了静态文件夹,为什么需要运行collectstatic?无论如何,我还是这样做了,但是还是没用。尽管进行了设置,但Django无法识别我的静态文件夹。
KindOfGuy 2012年

38
试试:python manage.py findstatic --verbosity 2 css/styles.css看看Django在哪里寻找您的静态文件。
deed02392

4
@ deed02392我知道这已经很久了,但是谢谢你,我找不到我为什么不工作的原因。无论我尝试更改多少STATIC_URL设置,它都不会起作用。然后,该命令帮助我找到了位置,但我不知道为什么它不会改变
Charles Smith

1
很高兴它对@Amon有所帮助,这也是帮助我弄清楚发生了什么的关键命令
deed02392

Answers:


125

这是django for Windows中静态/媒体/模板访问的有效解决方案,

settings.py

import os.path

STATIC_ROOT = ''

STATIC_URL = '/static/'

STATICFILES_DIRS = ( os.path.join('static'), )

4
谢谢,太好了!有关其他信息,请访问blog.xjtian.com/post/52685286308/…此博客,非常实用的说明,介绍了如何在Django中使用static。
教父2014年

10
os.path.join('static')给出简单'static'
斯瓦沃米尔Lenart

这也对我有帮助。为了更具体地确定我的问题,我在join()字符串中使用了前导“ /”。
马修·韦伯

STATIC_ROOT不需要规格。而且,正如@SławomirLenart指出的那样,您可以摆脱,join而只需使用字符串即可。
cirrusio

3
@cirrusio STATIC_ROOT实际上是我所需要的。我正在学习本教程,无法加载静态文件。我只添加了STATIC_ROOT =线,它开始工作。我不需要任何其他更改。
杰弗里·哈蒙

48

对我来说,这是由于在中将debug设置为false引起的settings.py。一种解决方法是将--insecure开关传递给runserver,但真正的解决方案是使用适当的Web服务器来提供静态文件。有关更多详细信息,请参见此问题的答案。


2
杜德 经过数小时的尝试,这解决了问题。谢谢
М.Б.

谢谢++我发疯了。
NiKo

这个!非常感谢,几乎疯狂地调试了我的静态文件...
jpdus

yyyuuup。可以在生产服务器上运行,但是我的一位开发人员在Windows上的本地运行服务器上遇到了问题。事实证明,需要在本地启用调试:-)谢谢!:-)
CeDeROM

21

如果在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静态文件,并使用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是否故意不同?(wwwvs website)?
Rikki

@Rikki是的,表明您可以添加其他静态文件目录。Django会将所有文件捆绑在这些目录中,并复制到STATIC_ROOT
eodgooch

8

来自上面的评论-运行此

python manage.py findstatic --verbosity 2 css/styles.css

找不到与“ css / styles.css”匹配的文件。

在以下位置查找:
/ Users /您的名称/ Documents / Workspace / test / staticfiles

我只是将我的静态文件夹重命名为staticfiles,一切都很好。(我在osx + Django 1.x上)

如果您使用的是本地开发设备,则使用不安全模式可能不会受到伤害-否则您可能仍然会收到404错误。

python manage.py runserver --insecure

更新

实际研究settings.py发现侵权行。

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'staticfiles'),
)

8

如果您最近在设置文件中将调试更改为false。请遵循以下步骤。

大多数情况下,它是由settings.py中的调试设置为false引起的。如果将--insecure开关传递给runserver,则它应该可以工作。因此,如果您确实python manage.py runserver 0.0.0.0:8000将其更改为python manage.py runserver 0.0.0.0:8000 --insecure

它应该工作。


2
通过阅读文档,我认为django将在开发模式下提供静态服务。另一方面,对于关闭开发模式,您应该真正使用nginx,因为django提供的静态服务效率很低。上面的标志意味着您承认这一事实。
亚当

7

我只是添加了相当于

STATICFILES_DIRS = (
    '/absolute_path_to_project/mealmate/static',
)

使它工作。当然,请替换absolute_path_to_project为您的实际路径,并在必要时添加驱动器号。


6

我还陷入了404问题,直到我意识到Apache阻止了对静态目录的请求。我曾经python manage.py collectstatic将所有静态文件复制到项目根目录下的静态目录中,即/ var / my / site / static。用

Alias /static /var/my/site/static
<Directory /var/my/site/static>
        Require all granted
</Directory>

/etc/httpd/conf/httpd.conf中,它现在可以正常工作。

如果以上答案均无效,则可以考虑检查服务器配置。


1
我已将alias设置Alias /static/ /var/my/site/staticdocs.djangoproject.com/en/1.11/howto/deployment/wsgi/modwsgi/…上的名称,并更改了第一个电话以/static解决我的问题。谢谢!
andrewec '17



2

我假设您在这里使用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">

1
嗨,我正在使用{{STATIC_URL}}。有点不清楚,我显示的html是呈现的文件,以证明该标记正在工作。我在本地工作,因此我认为只需要一个STATIC_URL设置,只要有/ static目录即可。
KindOfGuy 2012年



0

我认为您错过了将应用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可见。我在使用命令时遇到麻烦,这就是我修复它的方式。


0

在交友这是很好的解决方案在这里

在cpanel的终端上安装dj-static static3

pip install dj-static static3

然后在wsgi.py中替换此代码py应用程序

from dj_static import Cling

application = Cling(get_wsgi_application())

0

我遇到了同样的问题。在这里,我如何解决在模板中访问静态文件的问题。

我的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)

然后,我像这样访问template(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" height="100px" width="100px">
</body>

要么

您可以使用此django命令查看django在何处看到您的静态文件。资源

python manage.py collectstatic --help

0

对我来说,除了运行manage.py runserver myip:port外,我什么也不做。然后关闭它并重新启动uwsgi,静态文件成功加载。我不知道为什么,但是对我有用。


0

在我的情况下,我的静态文件在resources/static目录中,并且我设置了一些设置,例如blow in settings.pyfile:

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, './resources/static/'),
)

并在我的模板中像这样使用它:

% load static %}
    <link rel="stylesheet" type="text/css" href="{% static '/plugins/bootstrap/css/bootstrap.css' %}">

这种方式对我有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.