django url调度和中间件

时间:2010-10-18 15:00:01

标签: django django-urls middleware

在我的开发系统(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相关的中间件?

1 个答案:

答案 0 :(得分:2)

回溯中的哪些内容可以让您得出在调度URL之前调用中间件的结论?相反,很明显它在之后被调用,并且在调用视图之前,因为它显然具有要发送到的视图的名称 - serve,换句话说django.views.static.serve在你的urls.py中定义。