【问题标题】:Tastypie: Getting error during create_response()Tastypie:在 create_response() 期间出错
【发布时间】:2014-05-05 00:17:49
【问题描述】:

当我尝试覆盖 obj_create 时,我收到一条错误消息,我不明白为什么。

代码如下:

api.py:

class CardInfoResource(ModelResource):

    linked_client = fields.ForeignKey(ClientInfoResource, 'linked_client',
        blank=True, null=True, full=True)

    class Meta(CommonResourceMeta):
        queryset = Card.objects.all()
        resource_name = 'card_infos'
        fields = ['custom_pk']
        list_allowed_methods = ['post']
        detail_allowed_methods = ['post']
        authentication = ApiKeyAuthentication()

    def obj_create(self, bundle, request=None, **kwargs):
        # some stuff
        mydata = {'foo':'bar'}
        return self.create_response(request, mydata)

当向myAPI/card_infos/ 发送POST 请求时,带有一些数据的有效负载(在上面的示例中未使用),我得到一个JSON:

  • 错误消息:

    NoneType' 对象没有属性 'GET'

  • 回溯(我不会粘贴完整的堆栈,将错误发生在create_response() 上,负责的方法是determine_format(): if request.GET.get(\'format\'):\n\nAttributeError: \'NoneType\' object has no attribute \'GET\'\n')

错误似乎与obj_create定义中的Request=None有关,但仍然不知道如何解决。

我的目的可能看起来很奇怪,但我只想发布一些数据而不将其写入数据库。这就是为什么我调用create_response 并在覆盖的内部包含一些数据 obj_create() 方法。不确定这是一种干净的想法......

【问题讨论】:

  • 发布create_response() 代码和determine_format() 方法
  • 这不是我的代码。这是美味的馅饼。但我刚刚发现该错误与 obj_create 中的"request=None" 有关。但是还是不知道怎么解决
  • @DavidD。你得到答案了吗?

标签: django tastypie


【解决方案1】:

您正在对没有该属性的对象调用.GET。从 traceback 中我们可以看出这个对象是一个 None 单例,我们可以看到它没有使用 dir() 内置的 .GET 属性。

>>> dir(None)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__',     '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

obj_create() 中,如果没有传递请求关键字参数,则关键字参数request 默认为None

所以我希望您调用该方法而不是将HttpRequest 对象作为kwarg 传递,这意味着我们将None 传递给create_response() 函数。这可能期望传递的 request 变量是具有 .GET 属性的 HttpRequest 对象 - 但是因为它不是 AttributeError 被引发。

【讨论】:

  • 感谢您的解释。知道如何解决这个问题吗?我的目的可能看起来很奇怪,但我只想发布一些数据而不将其写入数据库。这就是为什么我在覆盖的obj_create() 方法中使用一些数据调用create_response。不确定这是一个干净的想法......
  • 任何请求都应该由 URLconf 处理,这应该将请求对象传递给某个视图以处理响应。您只需将该请求对象通过堆栈传递,以便它到达 obj_create() 函数,然后是 create_response 函数。什么在调用 obj_create()
  • 什么在调用 obj_create()
  • 抱歉,我不确定是否理解。提供任何示例代码吗?为了回答您的问题,在 resources.py (tastypie 文件)中, post_list 方法以这种方式调用 obj_create :bundle = self.build_bundle(data=dict_strip_unicode_keys(deserialized), request=request) updated_bundle = self.obj_create(bundle, **self.remove_api_resource_names(kwargs))
  • 这不是答案,我有同样的问题,没有解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多