Django static files on heroku

后端 未结 5 1504
借酒劲吻你
借酒劲吻你 2020-12-05 05:09

I deployed a django app to heroku, using \"git push heroku master\" which worked absolutely fine.

I then created a second app on the same git using \"heroku create s

相关标签:
5条回答
  • 2020-12-05 05:46

    I have been dealing with the same problem too. I tried not to use the solution recommended by David since it seems to be used only in development (and not production) (See: Heroku static files not loading, Django)

    And here are the 2 things that I changed in my code.

    (I'm using Django 1.7)

    1) settings.py

    I add these lines to the setting files

    BASE_DIR = os.path.dirname(os.path.dirname(__file__))
    STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
    STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
    TEMPLATE_DIRS = (
        os.path.join(BASE_DIR,  'templates'),
        # Add to this list all the locations containing your static files 
    )
    

    STATIC_ROOT: this tells Django where to (a) put the static files when you run "python manage.py collectstatic" and (b) find the static files when you run the application

    TEMPLATE_DIRS: this tells Django where to look for your static files when it search for statics files when you run "python manage.py collectstatic"

    2) wsgi.py

    Originally my file was:

    import os
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xxxx.settings")
    
    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()
    

    And I changed it to:

    import os
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xxxx.settings")
    
    from django.core.wsgi import get_wsgi_application
    from whitenoise.django import DjangoWhiteNoise
    application = get_wsgi_application()
    application = DjangoWhiteNoise(application)
    

    Read here for more information on whitenoise: https://devcenter.heroku.com/articles/django-assets#whitenoise


    Also, remember to install whitenoise: pip install whitenoise==2.0.6

    Before deploying the project, run: python manage.py collectstatic

    This will create a folder indicated by STATIC_ROOT (declared in your settings.py), containing all your static files.

    0 讨论(0)
  • 2020-12-05 05:49

    It seems that it's because you're using the staticfiles app without having set the STATIC_ROOT setting.

    In comparison, my settings.py is something like:

    # Static asset configuration
    BASE_DIR = os.path.dirname(os.path.abspath(__file__))
    STATIC_ROOT = 'staticfiles'
    STATIC_URL = '/static/'
    STATICFILES_DIRS = (
        os.path.join(BASE_DIR, '../myapp/static')
    

    You should set the STATICFILES_DIRS too (note that my conf for this var is probably not the same than yours)

    Then, push your code and try again. If it still doesn't work, you can use this to debug : https://devcenter.heroku.com/articles/django-assets#debugging

    0 讨论(0)
  • 2020-12-05 06:00

    Eventually solved this using the below in my urls file - from this question: Heroku - Handling static files in Django app

    from <app> import settings
    urlpatterns += patterns('',
            (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),
        )
    
    0 讨论(0)
  • 2020-12-05 06:02

    For Django 2.1.7, I did the following changes in order to work:

    1. Added whitenoise to requirements.txt in addition to gunicorn

    2. Project settings.py should have the following:

      A) static settings:

      STATIC_URL = '/static/'
      STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
      
      STATICFILES_DIRS = [
          os.path.join(BASE_DIR, "static"), 
      ]
      

      B) Add whitenoise to middleware:

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

    Finally commit and push your changes then deploy your app peacefully.

    0 讨论(0)
  • 2020-12-05 06:10

    Since Django 1.3 you've been able to do the following

    # only showing relevant imports
    from django.conf import settings
    from django.conf.urls.static import static
    
    
    urlpatterns = patterns(
        '',
    
        # your urls go here
    )
    
    if settings.DEBUG:
        urlpatterns += static(settings.STATIC_URL,
                              document_root=settings.STATIC_ROOT)
        urlpatterns += static(settings.MEDIA_URL,
                              document_root=settings.MEDIA_ROOT)
    
    0 讨论(0)
提交回复
热议问题