Django性能分析模块错误

1 投票
1 回答
1260 浏览
提问于 2025-04-16 03:50

我在下面的代码中遇到了一个错误。我相信对于有更多Python经验的人来说,这个问题是显而易见的。这段代码摘自 http://djangosnippets.org/snippets/727/

import sys
import cProfile
from cStringIO import StringIO
from django.conf import settings

class ProfilerMiddleware(object):
    def process_view(self, request, callback, callback_args, callback_kwargs):
        if settings.DEBUG and 'prof' in request.GET:
            self.profiler = cProfile.Profile()
            args = (request,) + callback_args
            return self.profiler.runcall(callback, *args, **callback_kwargs)

    def process_response(self, request, response):
        if settings.DEBUG and 'prof' in request.GET:
            self.profiler.create_stats()
            out = StringIO()
            old_stdout, sys.stdout = sys.stdout, out
            self.profiler.print_stats(1)
            sys.stdout = old_stdout
            response.content = '<pre>%s</pre>' % out.getvalue()
        return response

我把它实现成了中间件,但在页面上出现了以下错误。

Traceback (most recent call last):

  File "c:\Python26\lib\site-packages\django\core\servers\basehttp.py", line 280, in run
    self.result = application(self.environ, self.start_response)

  File "c:\Python26\lib\site-packages\django\core\servers\basehttp.py", line 674, in __call__
    return self.application(environ, start_response)

  File "c:\Python26\lib\site-packages\django\core\handlers\wsgi.py", line 245, in __call__
    response = middleware_method(request, response)

  File "C:\Users\Richard\workspace\race\src\race\..\race\middleware\ProfilerMiddleware.py", line 15, in process_response
    self.profiler.create_stats()

AttributeError: 'ProfilerMiddleware' object has no attribute 'profiler'

有什么想法吗?

1 个回答

0

谢谢你们的意见,Seth和Nick,

我解决了这个问题。我不太明白是什么导致的,但这和我的中间件调用顺序有关。

我根据Nick的评论进行了调试,他提到process_view没有被调用来创建对象。(我还是不太习惯Python的错误信息,没能及时发现!)我把process_response函数去掉了,并在process_view里加了一个打印语句,结果打印语句没有在开发控制台输出,这证明process_view没有被调用。我怀疑是中间件的设置顺序问题,结果运气不错。

我的设置如下,这两行是我中间件设置的最后两行:

不工作: 'firepython.middleware.FirePythonDjango', 'race.middleware.ProfilerMiddleware.ProfilerMiddleware',

工作: 'race.middleware.ProfilerMiddleware.ProfilerMiddleware', 'firepython.middleware.FirePythonDjango',

我不知道为什么会这样。我有时候在使用FirePython时也遇到一些奇怪的问题,所以可能有关系。通过这次经历我学到了一些东西,也许能更好地解决FirePython的问题。

谢谢大家

Rich

撰写回答