【问题标题】:Django Static files 404Django静态文件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,它也是帮助我弄清楚发生了什么的关键命令

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


【解决方案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中,现在可以正常使用了。

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

      【讨论】:

      【解决方案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" height="100px" width="100px">
                          </body>
                          

                          或

                          你可以使用这个 django 命令来查看 django 在哪里看到你的静态文件。 SOURCE

                          python manage.py collectstatic --help
                          

                          【讨论】:

                            【解决方案20】:

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

                            【讨论】:

                              【解决方案21】:

                              我能够通过将 js 文件名从骆驼大小写更改为蛇大小写来解决同样的问题。

                              【讨论】:

                                猜你喜欢
                                • 2020-10-17
                                • 1970-01-01
                                • 2014-06-07
                                • 1970-01-01
                                • 2017-06-05
                                • 2018-05-24
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多