2012-07-17 2 views
5

Sto eseguendo Django su Heroku. Posso eseguire correttamente collectstatic, ma quando vado sul sito è evidente che Django non è in grado di trovare i miei file statici. Ecco un frammento da mie impostazioni - Penso che sia per lo più roba standard:Django su Heroku - file statici non trovati

STATIC_ROOT = '' 

# URL prefix for static files. 
# Example: "http://media.lawrence.com/static/" 
STATIC_URL = '/static/' 

PROJECT_DIR = os.path.abspath(os.path.dirname(__file__)) 


# Additional locations of static files 
STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static". 
    # Always use forward slashes, even on Windows. 
    # Don't forget to use absolute paths, not relative paths. 
    os.path.join(PROJECT_DIR, 'static'), 
) 

# List of finder classes that know how to find static files in 
# various locations. 
if CLAYS_ENV == 'dev': 
    STATICFILES_FINDERS = (
     'django.contrib.staticfiles.finders.FileSystemFinder', 
     'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
     'django.contrib.staticfiles.finders.DefaultStorageFinder', 
    ) 

E nel mio caso la variabile CLAYS_ENV verrà impostato su 'dev'. Qualche idea sul perché Django può eseguire con successo collectstatic, ma poi non riesce a trovare i file in seguito?

risposta

3

Si consiglia di utilizzare file statici tramite un CDN (come Amazon S3) quando si utilizza Heroku. Mentre puoi ancora riuscire a servire quelli direttamente da Heroku, lo stesso processo che assiste alle richieste dinamiche serve anche dati statici, sprecando tempo di elaborazione. Inoltre, nel caso di file multimediali, l'uso di un CDN è obbligatorio, poiché il file system di Heroku è "ephimeral": ogni volta che si distribuisce un nuovo codice, una nuova immagine dello stack Cedar viene ricreata da zero e viene eseguito un nuovo checkout del codice. fatto. Ogni file non Git-tracked creato tra i deploys è perso.

+0

Tratto dall'articolo stesso: Questo sarà perfettamente adeguato per la maggior parte delle applicazioni, ma le applicazioni di alto livello potrebbero voler esplorare usando un CDN con Django-Storages. –

4

Colleziona statico e serve i supporti statici sono due cose diverse. Collectstatic mette semplicemente il supporto statico nel tuo STATIC_DIRS

L'elaborazione dei file statici è un processo del server non il comando collectstatic. Non sono mai stato distribuito su heroku in precedenza ma hai un URL per mappare le risorse statiche alla loro posizione?

if not settings.DEBUG: 
    urlpatterns += patterns('', 
     (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}), 
    ) 

Quale server stai utilizzando? Di solito, si desidera che il server supporti i supporti statici, invece del django. In Apache ciò avviene impostando Alias

+1

Nelle versioni più recenti di Django sarà probabilmente necessario modificare leggermente quanto sopra aggiungendo 'url' nella parte anteriore del modello di URL - ad es. 'url (r '^ static ...' –

+0

Questo approccio non dovrebbe essere usato in un ambiente di produzione, ma dovresti servire i file direttamente tramite wsgi. Puoi seguire queste istruzioni per servire in questo modo: https: // devcenter .heroku.com/articles/django-assets – Josh