Django与./manager runserver运行良好,而Django + uwsgi返回404

时间:2012-07-18 10:15:07

标签: python django static nginx uwsgi

这是关于staticsettings.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'

enter image description here

我已多次重启Nginx和uwsgi,但它不起作用。

2 个答案:

答案 0 :(得分:6)

首先,这是 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,真实的HTTP服务器,如Nginx),你应该运行collectstatic来(重新)构建STATIC_ROOT

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

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

  5. STATICFILES_DIRS:除了每个应用程序的“静态”子目录之外的其他静态目录。由于django.contrib.admin是具有“静态”文件夹的普通应用程序,因此无需在设置中指定它。

  6. 结论:如果STATIC_ROOT解析为/home/coat/www/site/app/static/,而STATIC_URL为/static/,那么您应该:

    1. 运行collectstatic管理命令

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

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

答案 1 :(得分:0)

在开发中,runserver命令为您的静态文件提供了一些魔力。在生产中,您需要配置NGinx来完成它。我建议您阅读Django文档中的两章:

  1. Serving static files in production
  2. Serving files (Deployment)
  3. 特别是最后一个链接说明了如何配置NGinx以提供静态文件。