将django app部署到heroku缺少CSS /静态文件

时间:2016-08-17 04:10:54

标签: python django heroku

前言这说我现在已经阅读了有关此问题的多篇帖子(包括hereherehere)。我的理解是static url中的settings.py需要修改heroku才能运行这些静态文件。我需要的东西,就像我是一个孩子一样,在静态目录嵌套在应用程序中时对这些static url进行调整 - 因为这是最近教程中传授的最佳实践(如果这不是理想的做法,我希望得到纠正)。

问题1: media文件应保存在应用程序内的目录中还是项目级别?

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

我的项目结构如下:

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

settings.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'

1 个答案:

答案 0 :(得分:3)

  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'),
    ]
    

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

  5. 作为旁注:注意不要使用术语"媒体"在这里,因为它在Django术语中具有特定含义,它引用user-uploaded文件,如配置文件图像,而不是属于您的代码库的文件,如CSS和JavaScript文件。