2010-10-18 3 views
1

В моей системе развития (Mac OS X), я добавил следующие строки в конце моего файла urls.py:Джанго URL диспетчеризация и промежуточного

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. Вещи, которые не работают, как ожидается, так что я вставлена ​​«утверждать False» в первой строке этой функции следующим образом:

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

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

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 называется AFTER url dispatching и перед вызовом views. Но это похоже на то, что Middleware вызывается перед отправкой URL.

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

ответ

2

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

+0

Да, вы правы, однако он по-прежнему не объясняет, почему промежуточное программное обеспечение перехватывает запрос медиафайла. Одно дополнение. Я просто скопировал весь проект на виртуальную машину с Apache, mod_python. Когда я делаю то же самое в этой виртуальной машине, все ведет себя так, как ожидалось. Запрос на/site_media/..... и т. Д. Не перехватывается промежуточным программным обеспечением. Таким образом, кажется, что существует проблема только при использовании сервера разработки. – Henri

+0

Я все еще не понимаю, почему вы думаете, что это проблема, или почему вы даже удивлены этим. Вы настроили представление для обслуживания носителя, перенаправленного вашим urls.py. Поэтому, конечно, он будет следовать за полным стекем Django. На вашем производственном оборудовании вы не используете этот url или view, поэтому он не проходит промежуточное программное обеспечение. Это именно то, чего вы должны ожидать. –

+0

Хорошо, верьте или нет, ваши ответы были очень полезными. Вы были правы, это не проблема. Спасибо за ваши ответы. – Henri

Смежные вопросы