9

我正在运行一个 django 1.4.1 应用程序。

我没有意识到仅仅django.contrib.staticfilesINSTALLED_APPS你的设置中加入就足以在settings.DEBUG为 True 时获得静态文件,也就是说,你不必手动向你的 urls 文件中添加任何东西。

我还注意到这绕过了 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

这与测试服务器的启动方式有关吗?

4

2 回答 2

14

我是在发帖后才发现的……</p>

如果您正在使用django-admin.py runserveror python manage.py runserver,那么添加常规中间件无法触及的静态文件处理程序会带来一些额外的魔力。

你可以通过运行来禁用它django-admin.py runserver --nostatic——参见django 文档

当你这样做时,--nostatic它会退回到你的应用程序中的 url,例如,如果你直接包含 staticfiles_urls() :

urlpatterns += staticfiles_urlpatterns()

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

于 2013-01-18T21:45:46.933 回答
1

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

发现的 url 解析为request.path_infonotrequest.path

于 2014-02-14T02:19:07.870 回答