【问题标题】:django url dispatching and middlewaredjango url 调度和中间件
【发布时间】:2010-10-18 15:00:01
【问题描述】:

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

【问题讨论】:

    标签: django django-urls middleware


    【解决方案1】:

    回溯中的什么使您得出这样的结论,即在 URL 调度之前调用了中间件?相反,很明显它是在那之后调用视图之前调用的,因为它清楚地具有将其发送到的视图的名称 - serve,换句话说,django.views.static.serve 定义在您的urls.py.

    【讨论】:

    • 是的,你是对的,但是它仍然没有解释为什么中间件会拦截媒体文件请求。一个补充。我刚刚将整个项目复制到运行 Apache 的虚拟机 mod_python 中。当我在这个 VM 中做同样的事情时,一切都按预期运行。 /site_media/..... 等上的请求不会被中间件拦截。所以看来只有在使用开发服务器的时候才有问题。
    • 我仍然无法理解您为什么认为这是一个问题,或者为什么您甚至对此感到惊讶。您已经设置了一个视图来提供媒体,由您的 urls.py 路由。因此,它当然会遵循完整的 Django 堆栈。在您的生产硬件上,您没有使用此 url 或视图,因此它不会通过中间件。这正是您应该期待的。
    • 信不信由你,您的回答非常有帮助。你是对的,这完全没有问题。感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2019-02-01
    • 2011-03-28
    相关资源
    最近更新 更多