使用tastypeupdate(PUT)在Python中启用CORS

2024-06-28 20:55:23 发布

您现在位置:Python中文网/ 问答频道 /正文

关于这个话题,有几个问题是如此的相关,但没有一个问题是我所看到的能够解决我的问题的。在

我在Django/tastypeapi中有一个端点,它接受PUT来更新数据库。当在localhost:8000中进行测试时,这非常有效,但是,我的生产数据库位于另一个域中,所以我需要启用CORS来获取这个PUT调用来更新数据库。在

我找到了教程here,该教程给出了如何执行cURL命令的示例:

curl -X PUT --dump-header - -H "Content-Type: application/json" -H "Authorization: ApiKey api:MYAPIKEY" -d "{\"mykey\": \"my_value\", \"resource_uri\": \"/api/v1/mytable/362/\"}" my.domain.com/api/v1/mytable/362/

我仍在接收未经授权的401个电话(标题转储如下):

^{pr2}$

我的核心资源超类代码:

class CorsResource(ModelResource):
    """ adds CORS headers for cross-domain requests """
    def patch_response(self, response):

        allowed_headers = ['Content-Type', 'Authorization']

        response['Access-Control-Allow-Origin'] = '*'
        response['Access-Control-Allow-Headers'] = ','.join(allowed_headers)
        return response

    def dispatch(self, *args, **kwargs):
        """ calls super and patches resonse headers
            or
            catches ImmediateHttpResponse, patches headers and re-raises
        """

        try:
            response = super(CorsResource, self).dispatch(*args, **kwargs)
            return self.patch_response(response)
        except ImmediateHttpResponse, e:
            response = self.patch_response(e.response)
            # re-raise - we could return a response but then anthing wrapping
            # this and expecting an exception would be confused
            raise ImmediateHttpResponse(response)

    def method_check(self, request, allowed=None):
        """ Handle OPTIONS requests """
        if request.method.upper() == 'OPTIONS':

            if allowed is None:
                allowed = []

            allows = ','.join([s.upper() for s in allowed])

            response = HttpResponse(allows)
            response['Allow'] = allows
            raise ImmediateHttpResponse(response=response)

        return super(CorsResource, self).method_check(request, allowed)

我的终结点代码:

class DataModelResource(CorsResource):

    data = fields.OneToOneField(DataModelResource, "data", full=True)

    class Meta:
        allowed_methods = ['get', 'put']
        authentication = ApiKeyAuthentication()
        authorization = Authorization()
        queryset = Data.objects.all()
        resource_name = 'mytable'

有人知道为什么从一个跨域生成PUT的代码会失败吗??? 我在这里完全不知所措。在


Tags: 代码selfapi数据库returnputresponsedef