0

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

阿贾克斯调用:-

 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 的授权和身份验证。我该如何调试这个问题?

4

2 回答 2

1

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

找到你的tastepie副本(可能在你的virtualenv中),打开文件resources.py并找到方法*post_list*。这是当对列表资源 URL 的 POST 请求发送到 Django 时调用的方法。

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

import pdb
pdb.set_trace()

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

现在,当您启动 devserver 并发出 ajax-call 时,执行应该在 set_trace() 处停止,并且您应该在 shell 中看到一个 python 提示符,您确实启动了 devserver。

现在您可以探索请求的运行时环境。例如,您可以通过在提示符下输入局部变量来检查它们。
你可以通过输入' l '(小L)来查看你所在方法的列表,用' n '执行下一行,用' s '进入一个函数。

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

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

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

于 2012-10-22T13:14:13.590 回答
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)
于 2012-10-23T09:29:29.273 回答