这个人近24小时一直困扰着我。由于某些原因,在我的linode服务器上,tastypie不会返回对POST的响应,直到它到达服务器的keepalive_timeout。它适用于通过override_urls处理的所有GET,PUT,DELETE和POST(我使用0.9.11进行tastypie),但任何标准POST(例如未处理的override_urls)只是坐在那里直到达到超时限制。 / p>
起初我认为这是服务器配置问题,但我现在开始怀疑它与tastypie有关。
相关的tastypie代码:
class MissionResource(ModelResource):
game = fields.ToOneField(GameResource, 'game')
mission_bank = fields.ToOneField('goosechase.website.api.MissionBankResource', 'mission', null = True)
class Meta:
queryset = Mission.objects.all()
resource_name = "mission"
always_return_data = True
list_allowed_methods = ['get', 'post', 'put', 'delete', 'patch']
excludes = ['hint_file_name']
filtering = {
"game" : ('exact'),
}
authentication = ApiKeyAuthentication()
authorization = Authorization()
# Added for testing various configs
def override_urls(self):
return [
url(r"^(?P<resource_name>%s)/manually-handled-post/$" %
self._meta.resource_name,
self.wrap_view('generic_post')),
]
# Test method for manually handled posts
def manually_handled_post(self, request, **kwargs):
self._meta.authentication.is_authenticated(request)
self.is_authorized(request)
return HttpResponse()
出于某种原因,在&#34;手动处理的帖子/&#34;端点工作正常,因为响应以毫秒为单位返回,但是一个典型的帖子在它到达服务器超时之前不会返回。我做的测试代码:
import requests
import json
# NORMAL POST ATTEMPT
response = requests.get('http://www.example.com/api/web/mission/19/?format=json&api_key=API_KEY&username=USERNAME')
event = json.loads(response.content)
del event['id']
del event['resource_uri']
response = requests.post('http://www.example.com/api/web/mission/?format=json&api_key=API_KEY&username=USERNAME', data=json.dumps(event), headers={'content-type': 'application/json'})
# DELAY UNTIL SERVER keepalive_timeout IS REACHED, THEN <Response [201]> IS RETURNED
# OVERRIDEN POST ATTEMPT
response = requests.post('http://www.example.com/api/web/mission/manually-handled-post/?format=json&api_key=API_KEY&username=USERNAME', data=json.dumps({}), headers={'content-type': 'application/json'})
# INSTANTANEOUS RESPONSE WITH <Response [200]>
我检查了没有导致延迟的保存或obj_create挂钩。我还验证了在多个模型资源上发生相同的问题。
由于overriden_urls完美运行,我认为POST的tastypie中存在一个错误,但我还没有在网上和github问题上找到任何东西。
之前是否有人遇到此问题并修复它而不将keepalive_timeout减少为0?
编辑1: 我开始使用时间戳记录来确定减速发生的位置。结果是代码没有减速,在返回响应之后发生了延迟(例如,返回http.HttpCreated(location = location))。当我强制POST返回状态代码202(通过http.httpAccepted)时,它工作正常。
所以现在看来问题源于我服务器上的 201状态代码。我不知道为什么会这样,所以如果有人能指出我正确的方向,我真的很感激。