Django Static文件404

时间:2012-10-09 22:38:19

标签: django static http-status-code-404

我无法获取静态文件。我尝试了各种设置和目录配置等等,但它们只是变成了404s。我安装了debug_toolbar,因此知道STATIC_URL正在到达我的请求上下文。

目录结构显示/静态(我还将目录放在了饭菜app文件夹和用户中,只是为了试一试。

/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">

有什么想法吗? 感谢

17 个答案:

答案 0 :(得分:95)

这是django for windows中静态/媒体/模板访问的工作解决方案,

settings.py

import os.path

STATIC_ROOT = ''

STATIC_URL = '/static/'

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

答案 1 :(得分:24)

对我而言,原因是settings.py中将debug设置为false。解决方法是将--insecure开关传递给runserver,但真正的解决方案是使用适当的Web服务器来提供静态文件。有关详细信息,请参阅this question的答案。

答案 2 :(得分: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 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

希望有所帮助!

答案 3 :(得分:5)

我只是添加了相当于

的内容
STATICFILES_DIRS = (
    '/absolute_path_to_project/mealmate/static',
)

让这个工作。当然,将absolute_path_to_project替换为您的实际路径,并在必要时添加驱动器号。

答案 4 :(得分:5)

我也陷入了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 中,它现在可以正常使用。

如果上述答案都不起作用,您可以考虑检查服务器配置。

答案 5 :(得分:4)

确保您的同伴在您的INSTALLED_APPS

答案 6 :(得分:3)

来自上面的评论 - 运行此

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

找不到&#39; css / styles.css&#39;。

的匹配文件      

查看以下位置:
  /用户/提供yourname /文档/工作区/测试/ staticfiles

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

如果你在本地开发盒上,使用不安全模式可能不会受到伤害 - 否则你可能仍然会收到404错误。

python manage.py runserver --insecure

更新

实际上挖掘settings.py发现了侵权行。

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

答案 7 :(得分: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">

答案 8 :(得分:2)

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

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

应该可以。

答案 9 :(得分:1)

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

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

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

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

这种方式对我有用。

答案 10 :(得分:1)

setting.py

中添加以下内容
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

答案 11 :(得分:0)

在项目主文件夹中的 settings.py 中插入以下几行:

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

然后,在html文件中插入:

{% load static %}

最后,在 settings.py 中,将 django.contrib.staticfiles 添加到 INSTALLED_APPS = [...]

答案 12 :(得分:0)

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

答案 13 :(得分: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>

OR

您可以使用此django命令查看django在哪里查看您的静态文件。 SOURCE

python manage.py collectstatic --help

答案 14 :(得分:0)

在Cpanel上,这是一个很好的解决方案here

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

pip install dj-static static3

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

from dj_static import Cling

application = Cling(get_wsgi_application())

答案 15 :(得分:0)

就我而言,我要做的就是重新运行服务器:

python manage.py runserver

答案 16 :(得分:0)

我认为您错过了将应用INSTALLED_APPS放入您的settings.py文件中,应该添加“ mealmate”

pywikibot

之后,django将看到静态文件和命令文件。我在使用命令时遇到了麻烦,这就是我解决问题的方法。