2010-09-08 2 views
1

У меня есть ошибка из следующего кода. Я уверен, что он обманут кого-то с большим опытом Python. Это фрагмент из http://djangosnippets.org/snippets/727/Ошибка модуля профилирования Django

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' 

Любые идеи?

+0

Что происходит, когда вы запускаете 'импорта cProfile' и' cProfile.Profile() '' от manage.py shell'? – Seth

+0

Очевидно, что вы попадаете в путь кода в 'process_response()', где он пытается использовать 'self.profiler', но' process_view() 'не был вызван таким образом, который его создает. –

ответ

0

Спасибо за ваши входной Сет и Ник,

Я установил ее. Я не понимаю, что вызвало это, но это связано с тем, что вызвано моим промежуточным программным обеспечением.

Я отлаживал его на основании комментария Ника о том, что process_view не был вызван для создания объекта. (Я до сих пор не привык к сообщениям об ошибках Python, чтобы их поднять!) Я избавился от функции process_response и поместил оператор print в process_view и, конечно же, оператор печати не был выведен на тестовой консоли dev, поскольку process_view не получал называется. Я подозревал, что настройки промежуточного программного обеспечения и мне повезло.

я имел следующие установки с этим быть последние 2 строки моей установки промежуточного слоя:

не работает: 'firepython.middleware.FirePythonDjango', 'race.middleware.ProfilerMiddleware.ProfilerMiddleware',

Рабочая: 'race.middleware.ProfilerMiddleware.ProfilerMiddleware', 'firepython.middleware.FirePythonDjango',

Не знаю, почему это так. Иногда у меня есть смешные вещи, связанные с FirePython, поэтому, возможно, это связано. Я немного научился, поэтому, возможно, стоит больше шансов исправить FirePython.

Спасибо, ребята

Rich

+0

Я думаю, что основная проблема заключается в том, что 'process_view' является странным местом для начальной настройки. Я думаю, что 'process_request' будет лучше, поскольку это, скорее всего, будет вызвано. –

+0

ОК спасибо Даниэлю, я постараюсь это завтра. – Rich

+0

Привет, Дэниэл, я попытался изменить его на process_request, но он вообще не работал. Я думаю, что, возможно, работа, которую должно выполнять промежуточное программное обеспечение, например, вычисление количества функций и времени их выполнения, происходит после запроса. Во всяком случае, я буду придерживаться изменения в заказе промежуточного программного обеспечения. Я подозреваю, что проблема связана с FirePython, как я уже сказал, но по крайней мере сейчас у меня проблемы. Спасибо, парни! – Rich

Смежные вопросы