Ответ на httpRequest после использования threading.Timer для задержки ответа - PullRequest
1 голос
/ 24 октября 2010

Я пытаюсь исправить встроенную в python инфраструктуру тестирования для javascript под названием mootools-test-runner (я разработчик внешнего вида днем, поэтому мои навыки работы с Python довольно слабые ... очень слабые).

Сценарий использования: мы хотим иметь возможность отправлять на сервер запрос json и задерживать его на x времени, прежде чем он возвращается - изначально он был написан для использования спящего метода, но это предотвратило несколько одновременных запросов. Оооо ... после около одного дня я пришел к следующему коду. Проблема, которую я вижу (хотя вполне может быть много проблем с моим кодом):

Представление test_runner.views.echo_json не возвращало объект HttpResponse.

если бы кто-нибудь мог дать какой-нибудь совет или указать мне правильное направление, я был бы очень благодарен - спасибо!

def echo_json(req, wasDelayed=False):
   if req.REQUEST.get('delay') and wasDelayed == False:
        sleeper(req, echo_jsonp)
   else:
        response = {}
        callback = req.REQUEST.get('callback', False)
        noresponse_eys = ['callback', 'delay']
        for key, value in req.REQUEST.items():
           if key not in noresponse_keys:
               response.update({key: value})

        response = simplejson.dumps(response)

        if callback:
           response = '%s(%s);' % (callback, response)

        return HttpResponse(response, mimetype='application/javascript')

def sleeper(req, callback)
    delay = float(req.REQUEST.get('delay'))
    t = threading.Timer(delay, functools.partial(callback, req, true))
    t.start()

1 Ответ

0 голосов
/ 25 октября 2010

Вы уверены, что хотите использовать оператор return внутри цикла for key, value?Вы разрешаете только одну итерацию и возвращаете.

Также проверьте поток функции.Есть случаи, когда он вернет None.Самый простой способ сделать это - распечатать объект запроса и проверить его в тех случаях, когда функция не возвращает объект HttpResponse.

Убедитесь, что ваша функция вернет None , если:

  • req.request содержит ключ 'delay' и значение wasDelayed равно True
  • req.REQUEST.items () пусто

Я не могуконечно, но я думаю, что 2 проблемы - это else: и return.Разве код под else: не должен выполняться независимо от того, задерживается ответ или нет?И не должен ли оператор return находиться вне цикла for?

...