如何在Django中提供静态文件?

时间:2020-06-22 13:15:44

标签: python django nginx gunicorn

我有一个文件夹static

static
-->css
----> main.css
-->images
----> image.png

Settings.py

STATICFILES_DIRS=[
    os.path.join(BASE_DIR, "static"),
]

STATIC_URL = '/static/'

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

我跑了collectstatic
现在我在static_cdn中有imagescssadmin(以前从未看过这最后一个)。
当我运行服务器时,它仍然不使用静态文件。
如何在不使用apache或nginx或类似东西的情况下将我的静态文件提供给服务器?

3 个答案:

答案 0 :(得分:1)

Django在生产环境中不提供静态文件,但会保持链接。当您的调试在生产环境中为假时,这里就是名为whitenoise的django应用程序在此处救援的地方。 在您的Django应用上安装whitenoise: pip install whitenoise然后 pip freeze > requirements.txt 之后,将此中间件添加到您的django项目设置中

MIDDLEWARE = [
  # 'django.middleware.security.SecurityMiddleware',
  'whitenoise.middleware.WhiteNoiseMiddleware',
  # ...
]

然后添加此行

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

然后将这段代码推送到生产服务器,并确保您运行collectstatic命令,即python manage.py collectstatic 您的静态文件现在应该可以工作了。

答案 1 :(得分:1)

以下是常见的DigitalOcean解决方案:

创建一个新的space并连接到它,例如通过MobaXterm

然后,您可以访问文件存储,您基本上只需要在manage.py目录中运行collectstatic

这里是official DigitalOcean Tutorial on deploying Django apps

与DigitalOcean一起部署时,您将需要nginx。

DigitalOcean空间在后台与Amazon S3 Bucket一起使用,因此您可以直接设置一个存储桶并使用它,但是对我而言,艰难的选择没有任何好处。只需使用DigitalOcean Space,因为它可以完美地链接到您的droplet

答案 2 :(得分:0)

要在生产环境中存储静态文件,您将需要诸如S3存储桶或其他某种外部存储之类的东西。部署到Heroku时,我喜欢使用whitenoise,因为它非常易于使用。这是配置示例:

MIDDLEWARE = [
    # ...
    'whitenoise.middleware.WhiteNoiseMiddleware',

]

# ...

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'build/static')
]
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'