django staticfiles跳过中间件吗?

时间:2013-01-18 21:34:50

标签: django django-staticfiles

我正在运行django 1.4.1 app。

我没有意识到在您的设置中只包含django.contrib.staticfilesINSTALLED_APPS就足以获得在settings.DEBUG为True时提供的静态文件,即您不必手动在您的网址文件中添加任何内容。

我也注意到这绕过了django中间件。有谁知道这种情况发生的原因或原因?


我刚创建了一个空白的新项目,我的views.py:

from django.http import HttpResponse
def index(request):
    html = '<html><body>Logo: <img src="/static/logo.gif"></body></html>'
    return HttpResponse(html)

我的urls.py:

from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
    url(r'^$', 'testapp.views.index', name='home'),
)

我的settings.py指定了一个目录来查找静态文件,并且还添加了以下内容:

MIDDLEWARE_CLASSES = (
    'testapp.middleware.TestMiddleware',
    ...
)

使用此中间件:

from __future__ import print_function
class TestMiddleware(object):
    def process_request(self, request):
        print("[REQUEST]", request.path)

当我提出请求时,会打印出来:

[REQUEST] /
[18/Jan/2013 15:30:27] "GET / HTTP/1.1" 200 60
[18/Jan/2013 15:30:27] "GET /static/logo.gif HTTP/1.1" 200 2190
[REQUEST] /favicon.ico

是否与测试服务器的启动方式有关?

2 个答案:

答案 0 :(得分:11)

我发布后才发现......

如果你正在使用django-admin.py runserverpython manage.py runserver,那么它会添加一个常规中间件无法触及的静态文件处理程序。

您可以通过运行django-admin.py runserver --nostatic来停用此功能 - 请参阅django docs

当你执行--nostatic时,它会回退到您应用中的网址,例如,如果您直接将staticfiles_urls()包含在:

urlpatterns += staticfiles_urlpatterns()

然后你的中间件将运行这些网址(当然还有其他所有网址)。

答案 1 :(得分:1)

尝试使用中间件修改request.path时发现此问题。

已发现的网址会针对request.path_info而不是request.path

解决