将 django 应用程序部署到 Heroku 缺少 CSS/静态文件

Jeb*_*h15 1 python django heroku

首先说我现在已经阅读了关于这个问题的多篇文章(包括这里这里这里)。我的理解是static urlinsettings.py需要修改 heroku 才能运行这些静态文件。我需要的,就像我小时候一样解释,是static url当静态目录嵌套在应用程序中时对这些进行什么调整——因为这是最近教程中传授的最佳实践(如果这不是理想的实践,我会感谢被纠正)。

问题1:如果该media文件被保存在目录中的应用程序内或在项目层次?

问题 2:如果媒体文件保存在应用程序内的目录中,例如我下面的目录,那么一旦推送到 heroku,我应该如何修改urlinsettings.py以加载静态文件?

我的项目结构如下:

gvlabs
    __init__.py
    __init__.pyc
    settings.py
    settings.pyc
    urls.py
    urls.pyc
    wsgi.py
    wsgi.pyc
manage.py
Procfile
requirements.txt
runtime.txt
welcome
    __init__.py
    __init__.pyc
    admin.py
    admin.pyc
    apps.py
    hello.py
    migrations
    models.py
    models.pyc
    static
        css
        fonts
        images
        js
    templates
        welcome
            base.html
            comingsoon.html
            contact_us.html
            index.html
            post_list.html
    tests.py
    urls.py
    urls.pyc
    views.py
    views.pyc
Run Code Online (Sandbox Code Playgroud)

设置.py

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(__file__))

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

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/
#STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_ROOT= os.path.join(PROJECT_DIR,'static')

STATIC_URL = '/welcome/static/'

# Extra places for collectstatic to find static files.
STATICFILES_DIRS = ()

# Simplified static file serving.
# https://warehouse.python.org/project/whitenoise/

STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
Run Code Online (Sandbox Code Playgroud)

D. *_*ans 7

  1. 您的配置的主要问题是STATIC_ROOT设置。您应该将其更改为类似os.path.join(BASE_DIR, 'static_root').

    STATIC_ROOT应该指向一个空目录(它不需要存在,Django 会在必要时创建它),Django 可以在其中收集您的静态文件,并在为它们提供服务之前对它们进行任何必要的处理。它不是您存储静态文件的目录。

  2. 无论您将静态文件放在哪里,您都不需要更改STATIC_URL设置。只需将其保留为/static/. 需要更改此设置的主要原因是当您通过 CDN 提供静态文件时,它将设置为类似https://my-cdn.example.com/static/

  3. 我会将静态文件保存在项目级别的目录中。有时,在创建可重用应用程序时,通过将其静态文件存储在应用程序内的目录中来将所有内容捆绑在一起是有意义的。但是我参与过的大多数项目都将主要的静态文件集保留在项目级别。

  4. 只要你告诉 Django 在哪里可以找到它们,你把静态文件放在哪里并不重要。您可以通过将目录路径添加到STATICFILES_DIRS设置中来做到这一点,如下所示:

    STATICFILES_DIRS = [
        os.path.join(PROJECT_DIR, 'static'),
    ]
    
    Run Code Online (Sandbox Code Playgroud)

    (从技术上讲,如果您的静态文件位于应用程序目录中,Django 应该能够自动找到它们,但让我们保持简单明了。)

  5. 附带说明:注意不要在此处使用术语“媒体”,因为它在 Django 术语中具有特定含义,它指的是用户上传的文件(如个人资料图像),而不是属于您的代码库的文件(如 CSS 和 JavaScript 文件)。