Статические файлы django пропускают промежуточное программное обеспечение?

Я запускаю приложение django 1.4.1.

Я не понимал, что достаточно просто включить django.contrib.staticfiles в INSTALLED_APPS в ваших настройках, чтобы статические файлы обслуживались, пока settings.DEBUG имеет значение True, т. е. вам не нужно вручную добавлять что-либо в файл URL-адресов.

Я также заметил, что это обходит промежуточное программное обеспечение django. Кто-нибудь знает, как и почему это происходит?


Я только что создал пустой новый проект, мой views.py:

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

Мой urls.py:

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

В моем settings.py указан каталог для поиска статических файлов, а также добавлено следующее:

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

Используя это промежуточное ПО:

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

И когда я делаю запрос, это распечатывается:

[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

Это как-то связано с запуском тестового сервера?


person MrColes    schedule 18.01.2013    source источник


Ответы (2)


Я понял это только после публикации…

Если вы используете django-admin.py runserver или python manage.py runserver, то добавление обработчика staticfiles, которого не может коснуться ваше обычное промежуточное программное обеспечение, делает дополнительную магию.

Вы можете отключить это, запустив django-admin.py runserver --nostatic — см. документы Джанго

И когда вы сделаете --nostatic, он вернется к URL-адресам в вашем приложении, например, если вы включите staticfiles_urls() напрямую с помощью:

urlpatterns += staticfiles_urlpatterns()

тогда ваше промежуточное ПО будет работать для этих URL-адресов (и, конечно же, для всех остальных).

person MrColes    schedule 18.01.2013

Обнаружил эту проблему при попытке изменить request.path с помощью промежуточного программного обеспечения.

Обнаруженные URL разрешаются против request.path_info, а не request.path

person Doug    schedule 14.02.2014