2011-10-15 21 views
9

Sto provando a utilizzare il progetto Django nonrel per Google App Engine. Ho impostato il progetto di test come descritto in here. Ho aggiunto una nuova cartella al progetto denominata "statico" per i miei file statici. E per il file app.yaml ho aggiunto le linee;Come utilizzare file statici con django nonrel

- url: /static 
static_dir: static 

Impossibile accedere ai file statici. Devo fare una configurazione aggiuntiva?

Thx in anticipo.

+0

Per caso stai mettendo i tuoi modelli lì? –

risposta

10

app.yaml non hanno nulla a che fare con Django, ma configura il front-end App Engine. La risposta dipende dal fatto che si desideri pubblicare file statici con Django o front-end (che è, beh, più economico e veloce).

Se solo "aggiunto" il vostro - url: /static mappatura fino alla fine, spostarlo prima il /.* jolly. Come tutte le mappature elaborate dall'alto verso il basso, vince la prima corrispondenza di corrispondenza.

4

Beh, l'ho appena capito. Basta usare la riga static_dir prima di main.py. Quindi l'app.yaml dovrebbe assomigliare a questo;

application: test 
version: 1 
runtime: python 
api_version: 1 

builtins: 
- remote_api: on 

inbound_services: 
- warmup 

handlers: 
- url: /_ah/queue/deferred 
    script: djangoappengine/deferred/handler.py 
    login: admin 

- url: /_ah/stats/.* 
    script: djangoappengine/appstats/ui.py 

- url: /media/admin 
    static_dir: django/contrib/admin/media 
    expiration: '0' 

- url: /static 
    static_dir: static 

- url: /.* 
    script: djangoappengine/main/main.py 
13

Dato che le persone già sottolineato, si dovrebbe mettere la vostra direttiva static_dir prima /.* modello

Tuttavia, questo non è l'unica cosa che dovete sapere su.

Mettendo questa direttiva nel app.yaml, fate AppEngine server web (che si tratti di sviluppo o server di produzione) di gestire il percorso /static, ed hai bisogno di tutti i file statici di essere dentro directory statica. Questo significa che si dovrà eseguire python manage.py collectstatic ogni volta che si cambia nulla nei file statici (soprattutto se avete/utilizzate applicazioni con file statici - come, ad esempio, o admindjango-tinymce) solo per testare le modifiche sul server locale

Quindi come evitarlo? Per impostazione predefinita, staticfiles fornisce agli helper il servizio di questi file sul server di sviluppo senza eseguire collectstatic ogni volta, il problema è il conflitto del nome della directory descritta nel paragrafo precedente: Django non riesce a catturare richieste sul percorso dei file statici, poiché vengono gestiti da appserver. È possibile risolverlo utilizzando strade diverse sul server di sviluppo e produzione:

# in settings.py 
if DEBUG: 
    STATIC_URL = '/devstatic/' 
else: 
    STATIC_URL = '/static/' 

(djangoappengine imposta DEBUG True sul server di sviluppo). Puoi lasciare ADMIN_MEDIA_PREFIX = '/static/admin/', ma ricordarsi di eseguire collectstatic almeno una volta prima di usare amministratore

Naturalmente ricordarsi di utilizzare {{ STATIC_URL }}path/to.css nei modelli invece di /static/path/to.css

Oh, e presumo che a distinguere la directory per i file statici originali voi lavorare su e la directory in cui devono essere raccolti i file statici. Io uso questo nel mio settings.py:

STATIC_ROOT = os.path.join(os.path.dirname(__file__), 'sitestatic') 
STATICFILES_DIRS = (
    os.path.join(os.path.dirname(__file__), 'static'), 
) 

Ciò significa: mettete i vostri fiels statici in static dir (e in static dirs tue app), collectstatic li raccoglie in sitestatic dir.Appropriato direttiva app.yaml è

- url: /static 
    static_dir: sitestatic 

Infine, è possibile configurare app.yaml di ignorare static e media directory durante il caricamento la vostra applicazione, dal momento che tutti i file statici saranno raccolti in e servita dalle sitestatic. Tuttavia, dovresti impostarlo solo durante il caricamento (altrimenti questi file non saranno disponibili nel server di debug)

+0

Potresti anche aver bisogno di aggiungere gli helper statici helper staticfiles e utilizzare il templatetag 'static' per i template resi senza RequestContext - vedi i [documenti] (https://docs.djangoproject.com/en/dev/howto/static- File/). Inoltre, assicurarsi che i percorsi dei file statici serviti da staticfiles dev helper non corrispondano alle voci static_dir o static_files in app.yaml. GAE distingue i file 'statici' e 'script' e l'appserver dev bloccherà Django dalla pubblicazione dinamica di file che ritiene statici - per essere coerenti con la produzione, dove viene bloccato per motivi di sicurezza. (GAE SDK 1.7.5) – jgiles

+1

non dimenticare di impostare la funzione di supporto statico in urls.py https://docs.djangoproject.com/en/dev/howto/static-files/#serving-static-files- in sviluppo – taelimoh

Problemi correlati