在Django中处理生产中的静态文件

时间:2014-11-11 12:46:20

标签: python django apache static

我有两个名为mediastatic的目录。

当我DEBUG = True时,一切正常,但如果我将其更改为DEBUG = False则会出现问题。

我读过我的服务器将处理生产中的静态文件。我理解为

在开发中,将所有静态文件放在我的目录static中都没关系,但是当我开始生产时,我需要将所有静态文件移动到另一个目录(它可能是static_www?)和在启动服务器之前,我运行python manage.py collectstatic。此命令会将所有文件从static_www移动到static,一切正常。

但为什么我需要有两个具有相同内容的独立目录?服务器如何知道我的文件已经通过collectstatic收集了(它只是文件夹中的文件,所以它如何知道差异)?我猜collectstatic主要用于多个目录中的静态文件,并希望在投入生产之前将它们全部收集起来。

settings.py中的变量如下所示:

STATIC_ROOT = os.path.join(BASE_DIR, "static")

STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static_www"),
)

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

MEDIA_ROOT = os.path.join(BASE_DIR, "media")

MEDIA_URL = '/media/'

它从static_www移动到static,因此在生产和开发中都没有使用我的目录static_www

也许所有这些设置都适用于只有另一台服务器用于处理静态文件的网站?

1 个答案:

答案 0 :(得分:0)

STATIC_ROOTSTATIC_URL的虚拟目录指向的地方。

示例:

STATIC_ROOT = '/var/www/example.com/static/'
STATIC_URL = 'http://www.example.com/static/'

collectstatic会在STATICFILES_DIR中找到所有静态文件并复制到STATIC_ROOT

Django会处理http://www.example.com/static/file.jpg的请求,并会提供/var/www/example.com/static/file.jpg

您可以使用以下内容将静态文件设置为其他网站:

STATIC_ROOT = '/var/www/static.example.com/static/'
STATIC_URL = 'http://static.example.com/static/'

通过这种方式,static.example.com可以是一个简单的服务器,它将在不受Django处理的情况下提供文件,从而提高网站性能。或者您可以上传到像Amazon S3(和CloudFront)等CDN