使用threading.Timer延迟响应后如何处理httpRequest

1 投票
1 回答
509 浏览
提问于 2025-04-16 06:01

我正在尝试修补一个用Python写的测试框架,叫做mootools-test-runner(我白天是前端开发,所以我的Python技能非常弱……真的很弱)。

我的需求是希望能够向服务器发送一个json请求,并让它在返回之前延迟一段时间——最开始是用一个叫做sleep的方法来实现的,但这样会导致无法同时处理多个请求。所以……经过大约一天的摸索,我找到了下面的代码。现在我遇到的问题是:

view 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

你确定要把 return 语句放在 for key, value 循环里面吗?这样的话,你只会执行一次循环就返回了。

另外,检查一下这个函数的流程。有些情况下,它会返回 None。最简单的方法是打印出你的请求对象,然后看看在函数没有返回 HttpResponse 对象的情况下是什么情况。

注意,如果你的函数会返回 None,那么可能是以下几种情况:

  • 请求中包含 'delay' 这个键,并且 wasDelayed 是 True
  • req.REQUEST.items() 是空的

我不能确定,但我觉得问题可能出在 else: 和那里的 return。难道 else: 下面的代码不应该在响应是否延迟的情况下都执行吗?而且 return 语句不应该放在 for 循环外面吗?

撰写回答