treq请求阻塞扭曲循环

时间:2015-10-23 21:39:02

标签: python django post python-requests twisted

我正在尝试使用treq在扭曲的循环内向我的本地api发送API POST请求。由于某种原因,我启动服务运行,它只是在我按Ctrl-C退出进程后才实际执行任何操作,因为它只打印了一堆疯狂的错误消息,因为它依赖的所有内容现在都是None。以下是我用来设置,发送和处理请求响应的代码:

def history_event(self, <params>):

    # ...

    headers = {'Authorization': 'Token {auth_token}'.format(auth_token=settings.MASTER_API_TOKEN)}
    url = "http://{LAN_IP}/api/call-history/{uuid}/".format(LAN_IP=settings.LAN_IP, uuid=tuuid)
    api_req = APIRequest(url=url, data=kwargs, method='POST', headers=headers)

    req = treq.request('POST', url, data=kwargs, headers=headers, timeout=10)
    req.addCallback(self.check_api_post, api_req)
    req.addErrback(self.queue_api_request, api_req)

这是django应用程序的一部分,因此设置只是对设置文件的引用。 APIRequest基本上只是dict,所以不要担心。此外,发送到函数的参数与问题无关,并且需要很长时间才能解释。在此代码段之前,它们已经被正确处理。

回调self.check_api_post是:

def check_api_post(self, response, api_request):
    status_code = response.code
    reason = response.content()
    http_error_msg = ''

    if 400 <= status_code < 500:
        http_error_msg = '%s Client Error: %s' % (status_code, reason)

    elif 500 <= status_code < 600:
        http_error_msg = '%s Server Error: %s' % (status_code, reason)

    if http_error_msg:
        self.queue_api_request(response, api_request, http_error_msg)

最后,错误self.queue_api_request是:

def queue_api_request(self, response, api_request, err_msg=None):
    if err_msg:
        self.log_error("Request failed with message: {}".format(err_msg))
    else:
        self.log_error("Actual Request failed")

    req = api_request
    producer = APIProducer(self.call_driver.rep_channel.realm.amqp)
    producer.push(req)

所有这一切都是使用我们基于类的amqp队列(我知道扭曲安全,因为我们在扭曲循环内部使用它并实现txamqp)。

为什么会阻止扭曲的循环?为什么它给了我很多的悲伤?!任何正确方向的帮助将不胜感激。我一定是完全错了或什么的。请放轻松我,因为我仍然完全迷失了如何编写好的扭曲代码...所以如果有人知道一个惊人的扭曲教程,这是一个额外的好处...请评论。提前感谢您的所有答案,如果您需要,请询问澄清或更多信息! :)

编辑:以下是我在其中一条日志消息中收到的内容:

  

请求失败并显示消息:401客户端错误:

首先,401应该是未经授权的错误,并且在那里没有任何意义。第二,为什么response.content()被推迟......?我应该屈服于此吗?这会解决这个问题吗?

编辑2:正如另一次更新一样,我尝试同时向treq.request()response.content()屈服,但无济于事。屈服于response.content()确实弹出了这样一个事实:没有提供Auth凭证(这没有任何意义,因为它们是,所以任何人都可以告诉我如何提供令牌auth头错误,请做。但..这仍然没有帮助我解决问题的主要部分,我按下Ctrl-C并且反应堆被强行停止后才得到那个答案...... :(这没有任何意义!

请有人帮我解决这个问题。指出我正确的方向。

编辑3:在浏览日志的同时,我也遇到了这个有趣的追溯,它不断弹出,并没有多大意义......

Unhandled Error
Traceback (most recent call last):
  File "/usr/src/callcenter/current/ppcc/server/daemon.py", line 25, in start_one
    self.ppcc.run()
  File "/usr/lib/python2.7/dist-packages/ppcc/server/manager.py", line 205, in run
    reactor.run()
  File "/usr/local/lib/python2.7/dist-packages/twisted/internet/base.py", line 1192, in run
    self.mainLoop()
  File "/usr/local/lib/python2.7/dist-packages/twisted/internet/base.py", line 1201, in mainLoop
    self.runUntilCurrent()
--- <exception caught here> ---
  File "/usr/local/lib/python2.7/dist-packages/twisted/internet/base.py", line 797, in runUntilCurrent
    f(*a, **kw)
  File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 379, in callback
    assert not isinstance(result, Deferred)
exceptions.AssertionError:

也许那会帮助我解决问题的人......?再次提前致谢!

编辑4:我也尝试了txrequests并在getPage()内置了扭曲,但都无济于事。我通过更改我的apache WSGI设置(转动WSGIPassAuthorization On)修复了401错误,但是在我按下CTRL-C之前它仍然不会发出请求,这......我在生产中无法真正做到。 / p>

0 个答案:

没有答案