开发者

Responding to httpRequest after using threading.Timer to delay response

开发者 https://www.devze.com 2023-01-21 13:51 出处:网络
I\'m trying to patch a testing framework built in python for javascript called mootools-test-runner (i\'m a front end developer by day, so my python skills are pretty weak... really weak.)

I'm trying to patch a testing framework built in python for javascript called mootools-test-runner (i'm a front end developer by day, so my python skills are pretty weak... really weak.)

The use case is we want to be able to make a json request to the server and have it delay x amount of time before it returns -- originally it was written to use a sleep method, but that prevented multiple simultaneous requests. Sooo... after poking around for about a day i arrived at the code below. The problem i'm seeing (although there could well be many problems with my code) is:

The view test_runner.views.echo_json didn't return an HttpResponse object.

if anyone could offer any advice or point me in the right direction I would be super grateful -- thanks!

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 norespons开发者_Python百科e_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()


Are you sure you want the return statement inside the for key, value loop? You're only allowing a single iteration, and returning.

Also, check the flow of the function. There are cases in which it will return None. Easiest way to do this is printing out your request object and examining it in the cases in which the function doesn't return an HttpResponse object.

See that your function will return None if:

  • req.request contains the key 'delay' and wasDelayed is True
  • req.REQUEST.items() is empty

I can't be sure, but I think the 2 problems are the else: and the return there. Shouldn't the code below the else: be executing whether the response is delayed or not? And shouldn't the return statement be outside the for loop?

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号