【问题标题】:Request is None in Non-orm Tastypie Resource flowNon-orm Tastypie 资源流中的请求为无
【发布时间】:2013-06-19 19:53:51
【问题描述】:

除了requestkwargsget_object_list 中为空之外,我的以下代码似乎工作正常

class Target(object):

    def __init__(self, x=None, y=None):
        self.id = 1 #Since tastypie needs an id
        self.x = x
        self.y = y



class TargetResource(Resource):
    x = fields.IntegerField(attribute='x')
    y = fields.IntegerField(attribute='y')

    def get_object_list(self, request=None, **kwargs):
        targets = []
        print 'Got Request %s kwargs %s' %(request, kwargs) 
        target = self.obj_get(request, **kwargs)
        targets.append(target)

        return targets

    def obj_get(self, request=None, **kwargs):
       #Do something that requires the request and kwargs
       #Return an instance of Target


    def detail_uri_kwargs(self, bundle_or_obj):
        kwargs = {}

        if isinstance(bundle_or_obj, Bundle):
            kwargs['pk'] = bundle_or_obj.obj.id
        else:
            kwargs['pk'] = bundle_or_obj.id

        return kwargs

    def obj_get_list(self, request=None, **kwargs):
        # Filtering disabled for brevity...
        return self.get_object_list(request)


    class Meta:
        resource_name = 'target'
        allowed_methods = ['get']
        object_class = Target
        authorization = DjangoAuthorization()
        authentication = MultiAuthentication(BasicAuthentication(), SessionAuthentication())

【问题讨论】:

    标签: python django rest tastypie


    【解决方案1】:

    obj_get_listget_list (tastypie/resources.py) 调用

    如果您查看get_list 代码:

    def get_list(self, request, **kwargs):
            base_bundle = self.build_bundle(request=request)
            objects = self.obj_get_list(bundle=base_bundle, *self.remove_api_resource_names(kwargs))
            ...
    

    您可以看到请求以捆绑的形式传递给obj_get_list

    所以你应该实现以下obj_get_list 来获取请求:

    def obj_get_list(self, request=None, **kwargs):
        return self.get_object_list(kwargs['bundle'].request)
    

    【讨论】:

      【解决方案2】:

      **kwargs 没有被填充,因为普通的get_object_list() 不接受它们。来自tastypie/resources.pydef get_object_list(self, request): 至于request,类似:

      def get_object_list(self, request):
          if request is None:
              import pdb
              pdb.set_trace()
          # the rest of your get_object_list() code
      

      应该让你进入调试器,让你找出哪些代码没有传递请求。

      【讨论】:

        猜你喜欢
        • 2012-06-03
        • 2013-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多