TastyPie obj创建方法未被调用

时间:2012-10-22 07:37:33

标签: django tastypie

是TastyPie的新手。我有一个非常简单的资源,并按以下方式覆盖obj_create方法。

Ajax Call: -

 var data2 ={
                  "crave": data1,
                  "uid": "100",
                  "access_token": "AAA"                     
              };                                                   
              $.ajax({
                  url: "http://localhost:8000/restapi/v1/icrave/",
                  type: 'POST',                     
                  data: data2,
                  contentType: 'application/json',
                  dataType: 'json',
                  success: function (res) {
                      console.log(res);
                  },
              });

在资源中

class IcravesResource(ModelResource): 
person = fields.ForeignKey(UserResource, 'person')
class Meta:

    queryset = Icrave.objects.filter(anonymous_or_not = False,is_active = True).order_by('-datetime')
    resource_name = "icrave" 
    allowed_methods = ['get','post']
    authentication =  GetAuthentication()     
    authorization = GetAuthorization()      

def obj_create(self,bundle,request=None, **kwargs):                
        print "Check if code reached here !!!"

        return super( IcravesResource, self ).obj_create( self, bundle, request, **kwargs )

代码未到达此处。我究竟做错了什么 ?我检查了授权和身份验证,他们都返回true。我该如何调试此问题?

2 个答案:

答案 0 :(得分:1)

您可以使用Python调试器。 (http://docs.python.org/library/pdb.html

找到你的tastypie副本(可能在你的virtualenv中),打开文件 resources.py 并找到方法* post_list *。这是在向Django发送对list-resource URL的POST请求时调用的方法。

你会在那个方法的某个地方找到对* obj_create *的调用。现在,您可以通过添加以下行来设置断点:

import pdb
pdb.set_trace()

在那个方法中。也许作为第一个声明。

现在,当你启动你的d​​evserver并发出你的ajax-call时,执行应该停在set_trace()处,你应该在shell中看到你启动了devserver的python提示符。

现在您可以探索请求的运行时环境。例如,您可以通过在提示符下输入来检查局部变量 您可以通过键入“ l ”(小L)查看您所使用方法的列表,使用“ n ”执行下一行,然后单步执行'<强>取值'。

这可以帮助您了解正在发生的事情。花点时间学习如何使用pdb,这非常值得。

有关pdb和django的更多信息,请参阅:

http://ericholscher.com/blog/2008/aug/31/using-pdb-python-debugger-django-debugging-series-/

答案 1 :(得分:0)

您能否根据服务器日志验证服务器是否实际收到了POST请求?

如果是这样,你也可以尝试通过输入:

来指定允许的方法列表
list_allowed_methods = ['post', 'get']

而不是一般allowed_methods一个。

这是一个代码片段,对我有用:

class EntryDetailsResource(CommonResource):

    class Meta:
        queryset = Entry.objects.all()
        detail_allowed_methods = ['put','get','delete']
        list_allowed_methods = ['post', 'get']
        authorization = DjangoAuthorization()
        validation = EntryDetailsValidation()

    def obj_create(self, bundle, request=None, **kwargs):
        import sys
        print sys.stderr, 'aa'
        return super(CommonResource, self).obj_create(bundle, request, user=request.user)