Python treq请求阻塞扭环

Python treq请求阻塞扭环,python,django,post,python-requests,twisted,Python,Django,Post,Python Requests,Twisted,我正在尝试使用treq向twisted循环中的本地API发送API POST请求。出于某种原因,我启动服务运行,它实际上只在我按下Ctrl-C退出流程后才执行任何操作,因为它所依赖的一切现在都是None。以下是我用于设置、发送和处理请求响应的代码: def history_event(self, <params>): # ... headers = {'Authorization': 'Token {auth_token}'.format(auth_token=s

我正在尝试使用treq向twisted循环中的本地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)
最后,errback
self.queue\u api\u请求是:

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)
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队列(twisted-safe我知道,因为我们在twisted循环中的所有地方都使用它,并且它实现了)

为什么这会阻碍扭曲的循环?为什么它让我悲伤万分?!如能在正确的方向上给予帮助,我们将不胜感激。我一定是做错了什么。请对我放松点,因为我仍然完全不知道如何编写好的扭曲代码。。。因此,如果有人知道一个令人惊奇的扭曲教程,那么作为额外的奖励。。。请评论。提前感谢您的所有回答,如果您需要,请询问澄清或更多信息!:)

编辑:以下是我在一条日志消息中得到的信息:

请求失败,消息为:401客户端错误:

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

编辑2:就像另一个更新一样,我尝试屈服于
treq.request()
response.content()
两个版本,但都没有成功。屈服于
response.content()
确实弹出了没有提供身份验证凭据的事实(这是没有意义的,因为它们是,所以任何人都可以告诉我我是如何提供错误的令牌身份验证头的,请这样做。但是……这仍然不能帮助我回答问题的主要部分,我只是在按下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:
未处理的错误
回溯(最近一次呼叫最后一次):
文件“/usr/src/callcenter/current/ppcc/server/daemon.py”,第25行,在start\u one中
self.ppcc.run()
文件“/usr/lib/python2.7/dist packages/ppcc/server/manager.py”,第205行,正在运行
反应堆运行()
文件“/usr/local/lib/python2.7/dist-packages/twisted/internet/base.py”,第1192行,运行中
self.mainLoop()
文件“/usr/local/lib/python2.7/dist-packages/twisted/internet/base.py”,第1201行,在mainLoop中
self.rununtlcurrent()
---  ---
文件“/usr/local/lib/python2.7/dist packages/twisted/internet/base.py”,第797行,在rununtlcurrent中
f(*a,**千瓦)
文件“/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py”,第379行,在回调中
断言不存在(结果,延迟)
异常。断言错误:
也许这会帮助别人解决我的问题…?再次提前感谢


编辑4:我也尝试了内置的twisted,但都没有效果。我通过更改apache WSGI设置(打开
WSGIPassAuthorization
)修复了401错误但是,直到我按下CTRL C,它仍然不会发出请求,这是我在生产过程中不能真正做的。

你能考虑把这个代码变成一个吗?这里有太多的事情要提供一个全面的答案。我必须猜测你的应用程序中有多少代码。最好你可以模拟Django/MMODWSGI。通过使用钩针启动并运行后台扭曲循环的脚本(这就是您在这里所做的吗?)来耍花招,您看到的
AssertionError
就是调用
Deferred.callback()时发生的事情
带有一个
Deferred
实例。从中调用它的行表明它来自线程调用队列,这意味着有人调用了
callFromThread(d.callback,Deferred())你不应该真的在线程中构造<代码>延迟< /代码>,所以这里有一些东西被打破了。你能考虑把这个代码变成一个吗?这里有太多的事情要提供一个全面的答案。我必须猜测你的应用程序中的大量代码。django/mod_wsgi只是通过使用钩针启动并运行后台扭曲循环的脚本(这就是您在这里所做的吗?)来进行恶作剧。为了实现它的价值,您看到的
AssertionError
就是调用
Deferred.callback()时发生的事情
带有一个
延迟的
实例。从中调用它的行表明它来自线程调用队列,这意味着有人调用了
线程(d.callback,Deferred())
或类似的东西。你不应该在线程中真正构造
延迟的
,所以这里有些东西坏了。