【问题标题】:Does django staticfiles skip the middleware?django 静态文件是否跳过中间件?
【发布时间】:2013-01-02 16:48:15
【问题描述】:

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

我没有意识到在您的设置中仅将django.contrib.staticfiles 包含在INSTALLED_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

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

【问题讨论】:

    标签: django django-staticfiles


    【解决方案1】:

    我是在发帖后才发现的……

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

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

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

    urlpatterns += staticfiles_urlpatterns()
    

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

    【讨论】:

      【解决方案2】:

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

      发现的网址解析为request.path_info 而不是request.path

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-26
        • 2021-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-05
        相关资源
        最近更新 更多