2012-06-27 17 views
9

Ho una domanda generale sulla nuova struttura di file statici di Django 1.3.django staticfiles nella radice url

Mi piace molto la nuova funzionalità di staticfile di Django introdotta in Django 1.3. Normalmente, ho impostato STATIC_URL = "/ static /" e ho inserito il tag del template {{STATIC_URL}} nei miei template. È fantastico il modo in cui il server di sviluppo serve automaticamente i file statici e tutti i miei contenuti vengono pubblicati come previsto.

The {{ STATIC_URL }} would be substituted in the template and might serve up files like this... 
example.com/static/css/master.css 
example.com/static/images/logo.png 
example.com/static/js/site.js 

Tuttavia, sto lavorando con un sito legacy in cui il supporto statico è montato nella radice url. Ad esempio, il percorso per gli URL statici potrebbe essere simile a questo:

example.com/css/master.css 
example.com/images/logo.png 
example.com/js/site.js 

Non usa lo spazio dei nomi url "statico".

Mi chiedevo se c'è un modo per ottenere la nuova funzionalità staticfile per non utilizzare lo spazio dei nomi statico e servire gli URL sopra, ma mantengono ancora i vantaggi del nuovo framework staticfile (file statici collettatici serviti dal server di sviluppo, eccetera). Ho provato a impostare STATIC_URL = "" e STATIC_URL = "/", ma nessuno dei due sembrava avere l'effetto desiderato.

C'è un modo per configurare i file statici per servire file statici senza uno spazio dei nomi? Grazie per la tua considerazione.

risposta

4

È possibile aggiungere manualmente posizioni in più che non esistono nei static directory all'interno del progetto:

urls.py

from django.conf import settings 
from django.conf.urls.static import static 

urlpatterns = patterns('', 
    # ... the rest of your URLconf goes here ... 
) 

if settings.DEBUG: 
    urlpatterns += static('/css/', document_root='app_root/path/to/css/') 
    urlpatterns += static('/images/', document_root='app_root/path/to/images/') 
    urlpatterns += static('/js/', document_root='app_root/path/to/js/') 

Ciò mappare il supporto per il server DEBUG dev. E quando stai usando il tuo server in modalità produzione, gestirai ovviamente queste posizioni statiche dal server web invece di inviare la richiesta a django.

+0

Grazie jdi. Nei template, avrei ancora {{STATIC_ROOT}} o semplicemente lo lascerei come/css /,/images /,/js/....? –

+0

Non farebbe più parte dell'app statica, perché non può essere raccolto tramite 'python manage.py collectstatic'. Dovresti semplicemente usare URL semplici come questo: '/ css/foo.css'. Questi vengono offerti esplicitamente da singole posizioni. Possono persino esistere al di fuori dello spazio del progetto django. – jdi

+0

document_root non dovrebbe iniziare con '/', devi specificare la directory root del tuo progetto django, ad esempio: 'urlpatterns + = static ('/ css /', document_root = 'root_app/percorso/a/css /') ' –

2

perché non mantenere la funzionalità staticfile e utilizzare semplicemente riscritture a livello di server Web per servire il contenuto.

per esempio:

rewrite /css /static permanent; (for nginx) 

questo manterrebbe directory del progetto molto più pulito e anche rendere più facile per spostare le directory statiche in giro per il futuro, ad esempio per spostare al vostro STATIC_URL a un CDN.

1

In questo modo si imposta il tuo urls.py di servire sia index.html e altri file statici in/a Django 1.10 (pur essendo in grado di servire altre viste Django):

from django.contrib.staticfiles.views import serve 
from django.views.generic import RedirectView 

urlpatterns = [ 

    #/routes to index.html 
    url(r'^$', serve, 
     kwargs={'path': 'index.html'}), 

    # static files (*.css, *.js, *.jpg etc.) served on/
    url(r'^(?!/static/.*)(?P<path>.*\..*)$', 
     RedirectView.as_view(url='/static/%(path)s')), 
] 

Vedere this answer in cui ho scritto una spiegazione più completa di tale configurazione, specialmente se si desidera utilizzarla per la produzione.