使用threading.Timer延迟响应后响应httpRequest

时间:2010-10-24 19:43:44

标签: python django multithreading timer httpresponse

我正在尝试修补一个用python构建的测试框架,用于称为mootools-test-runner的javascript(我是白天的前端开发人员,所以我的python技能非常弱......真的很弱。)

用例是我们希望能够向服务器发出json请求并让它在返回之前延迟x个时间 - 最初它被编写为使用sleep方法,但是这阻止了多个同时请求。 Sooo ...在探索了大约一天后,我到达了下面的代码。我看到的问题(尽管我的代码可能存在许多问题)是:

视图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 :(得分:0)

您确定要在return循环中使用for key, value语句吗?你只允许一次迭代,然后返回。

另外,检查功能的流程。在某些情况下,它将返回None。最简单的方法是打印出请求对象,并在函数未返回HttpResponse对象的情况下检查它。

如果符合以下条件,请确保您的函数将返回无

  • req.request包含密钥'delay',isDelayed为True
  • req.REQUEST.items()为空

我无法确定,但我认为有两个问题是else:returnelse:以下的代码是否应该执行响应是否延迟?并且返回语句不应该在for循环之外吗?