TastyPie在到达keepalive_timeout

时间:2015-05-21 13:47:00

标签: nginx tastypie linode

这个人近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状态代码。我不知道为什么会这样,所以如果有人能指出我正确的方向,我真的很感激。

0 个答案:

没有答案