我正在尝试使用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>