【问题标题】:Django with ./manager runserver works well, while Django + uwsgi return 404带有 ./manager runserver 的 Django 运行良好,而 Django + uwsgi 返回 404
【发布时间】:2012-07-18 10:15:06
【问题描述】:

这是我在settings.py 中关于static 的settings.py:

STATIC_ROOT = '/home/coat/www/site/app/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
"/usr/lib/python2.6/site-packages/django/contrib/admin/static/",
# This is Django admin default static files
)

我使用 django 服务器:

./manager runserver

然后我打开网址:http://localhost:8000/static/admin/css/base.css

效果很好。

但是一个开放的http://localhost/static/admin/css/base.css

它打印'404'

Nginx 和 uwsgi 重启了很多次,还是不行。

【问题讨论】:

  • 请为该站点发布 nginx 配置

标签: python django static nginx uwsgi


【解决方案1】:

首先,这是nonono

STATIC_ROOT = '/home/coat/www/site/app/static/'

永远不要硬编码绝对路径,您只是在降低设置文件的可移植性,并且可能会杀死小猫。根据您的需要进行调整:

import os.path
import posixpath

PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')

STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')

# fix STATICFILES_DIRS too

现在,回答你的问题。 django.contrib.staticfiles 很棒,但一开始可能有点混乱。

  1. 必须了解collectstatic command

    将静态文件收集到 STATIC_ROOT。 [...] 使用启用的查找器搜索文件。默认是查看 STATICFILES_DIRS 中定义的所有位置以及 INSTALLED_APPS 设置指定的应用程序的“静态”目录。

  2. 使用 runserver,静态文件会自动提供,但在生产模式下(DEBUG=False,像 Nginx 这样的真实 HTTP 服务器),您应该运行 collectstatic 以(重新)构建 STATIC_ROOT

  3. STATIC_ROOT:是 HTTP 服务器应提供静态文件的根路径。

  4. STATIC_URL:是 HTTP 服务器应该向 提供静态文件的根 URL。

  5. STATICFILES_DIRS:除了每个应用程序的“静态”子目录之外的其他静态目录。因为 django.contrib.admin 是一个普通的应用,有一个“静态”文件夹,所以不需要在设置中指定。

结论:如果STATIC_ROOT解析为/home/coat/www/site/app/static/,且STATIC_URL为/static/,那么你应该:

  1. 运行 collectstatic 管理命令

  2. 将 Nginx 配置为在 /static/ 上服务 /home/coat/www/site/app/static/,即:

    location ^~ /static/ {
        alias /home/coat/www/site/app/static/;
    }
    
  3. 重新加载 nginx

【讨论】:

    【解决方案2】:

    在开发过程中,runserver 命令可以为您的静态文件提供服务。在生产中,您需要配置 NGinx 来执行此操作。我推荐你阅读的Django文档中有两章:

    1. Serving static files in production
    2. Serving files (Deployment)

    特别是最后一个链接解释了如何配置 NGinx 以提供静态文件。

    【讨论】:

      猜你喜欢
      • 2011-05-04
      • 2021-04-07
      • 2016-02-05
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 2022-07-07
      相关资源
      最近更新 更多