Диспетчеризация и промежуточное ПО - PullRequest
1 голос
/ 18 октября 2010

В моей системе разработки (mac os x) я добавил следующие строки в конец моего файла urls.py:

if re.match('darwin',sys.platform):
# serving media files using the development server
    urlpatterns += patterns('',(r'^site_media/(?P<path>.*)$',
        'django.views.static.serve',
        {'document_root': '/Users/henri/sites_django/wmsproject/wmssite/site_media'}),)

для обслуживания медиа-файлов.

ВсеИдет как ожидалось, ну почти ...

Я включил класс Middleware для перехвата обработки перед вызовом моих представлений.В этом промежуточном программном обеспечении я определил функцию process_view.Все работает не так, как ожидалось, поэтому я вставил «assert False» в качестве первой строки этой функции следующим образом:

def process_view(self, request, view_func, view_args, view_kwargs):
    assert False

Когда я ввожу этот URL в моем браузере:

http://localhost:8000/site_media/images/logo_wms_web.gif

Я вижу, к моему большому удивлению, следующую информацию о дампе:

self         <wmssite.middleware.LanguageMiddleware.LanguageRedirect instance at 0x10117fe60>
view_args    {}
view_func    <function serve at 0x101281578>
view_kwargs  {'document_root': '/Users/henri/sites_django/wmsproject/wmssite/site_media', 'path': u'images/logo_wms_web.gif'}

Параметры, которые я вижу в дампе, это именно те параметры, которые вы видели в файле urls.py, который я только что показал.Диспетчеризация URL происходит до вызова представлений (очевидно), но я также думал, что Middleware вызывается ПОСЛЕ диспетчеризации URL и до вызова представлений.Но похоже, что Middleware вызывается перед отправкой URL.

Так что, похоже, я ошибся.Может кто-нибудь объяснить, когда именно Middleware вызывается в связи с отправкой URL?

1 Ответ

2 голосов
/ 18 октября 2010

Что в трассировке приводит вас к выводу, что промежуточное программное обеспечение вызывается перед отправкой URL?Напротив, ясно, что он вызывается после этого и перед вызовом представления, поскольку он явно имеет имя представления, к которому отправляется - serve, другими словами django.views.static.serve, как определено в вашемurls.py.

...