使用./manager runserver的Django运行良好,而Django + uwsgi则返回404

这是我settings.py 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

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

它工作得很好。

但打开http://localhost/static/admin/css/base.css

它打印'404'

在这里输入图像说明

我曾经多次重启Nginx和uwsgi,但是没有成功。

首先,这是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命令 :

    将静态文件收集到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服务/home/coat/www/site/app/static/ on /static/ ,例如:

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

在开发中,runserver命令会为您的静态文件提供一些神奇的功能。 在生产中,您需要配置NGinx来完成。 Django文档中有两章我建议你阅读:

  1. 在生产中提供静态文件
  2. 提供文件(部署)

特别是最后一个链接解释了你如何配置你的NGinx来为你的静态文件提供服务。