2013-01-18 5 views
6

Sto eseguendo un'applicazione django 1.4.1.I file statici di django saltano il middleware?

non mi rendevo conto che proprio tra cui django.contrib.staticfiles in INSTALLED_APPS nelle impostazioni è sufficiente per ottenere i file statici serviti mentre settings.DEBUG è vero, vale a dire, non c'è bisogno di aggiungere manualmente qualsiasi cosa per il file URL.

Ho anche notato che questo aggira il middleware django. Qualcuno sa come o perché questo accade?


Ho appena creato un nuovo progetto vuoto, il mio views.py:

from django.http import HttpResponse 
def index(request): 
    html = '<html><body>Logo: <img src="/static/logo.gif"></body></html>' 
    return HttpResponse(html) 

mio urls.py:

from django.conf.urls import patterns, include, url 
urlpatterns = patterns('', 
    url(r'^$', 'testapp.views.index', name='home'), 
) 

mio settings.py ha specificato una directory per cercare file statici, e ha anche aggiunto:

MIDDLEWARE_CLASSES = (
    'testapp.middleware.TestMiddleware', 
    ... 
) 

Usando questo middleware:

from __future__ import print_function 
class TestMiddleware(object): 
    def process_request(self, request): 
     print("[REQUEST]", request.path) 

E quando faccio una richiesta, questo viene stampato:

[REQUEST]/
[18/Jan/2013 15:30:27] "GET/HTTP/1.1" 200 60 
[18/Jan/2013 15:30:27] "GET /static/logo.gif HTTP/1.1" 200 2190 
[REQUEST] /favicon.ico 

E 'qualcosa a che fare con il modo il server di prova si avvia?

risposta

10

Ho appena capito questo dopo la pubblicazione ...

Se stai usando django-admin.py runserver o python manage.py runserver, poi lo fa un po 'di magia in più per aggiungere un gestore di staticfiles che il middleware regolare non può toccare.

È possibile disattivare questa eseguendo django-admin.py runserver --nostatic - vedere il django docs

E quando lo fai --nostatic cadrà di nuovo agli URL nella vostra applicazione, come ad esempio se si includono staticfiles_urls() direttamente con:

urlpatterns += staticfiles_urlpatterns() 

quindi il tuo middleware funzionerà per quegli URL (e ovviamente tutti gli altri).

1

Trovato questo problema quando si tenta di modificare request.path con il middleware.

gli URL rilevati risolvono contro non request.path_inforequest.path