我正在运行django 1.4.1 app。
我没有意识到在您的设置中只包含django.contrib.staticfiles
到INSTALLED_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
是否与测试服务器的启动方式有关?
答案 0 :(得分:11)
我发布后才发现......
如果你正在使用django-admin.py runserver
或python 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