1

在我的开发系统(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'}),)

为了提供媒体文件。

一切都按预期进行,几乎...

在调用我的视图之前,我包含了一个中间件类来拦截处理。在这个中间件中,我定义了一个 process_view 函数。事情没有按预期工作,所以我在这个函数的第一行插入了一个“assert 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 调度发生在调用视图之前(显然),但我也认为中间件是在 url 调度之后和调用视图之前调用的。但这看起来像是在 URL 调度之前调用了中间件。

所以看来我弄错了。有人可以解释一下何时调用与 URL 调度相关的中间件吗?

4

1 回答 1

2

回溯中的什么导致您得出这样的结论:在 URL 调度之前调用了中间件?相反,很明显,它是在那之后和调用视图之前被调用的,因为它显然具有它被发送到的视图的名称 - serve,换句话说django.views.static.serve,如您的 urls.py 中定义的那样。

于 2010-10-18T15:16:49.530 回答