2012-07-25 63 views
4

我在使用tastypie并向其发布数据时遇到问题。我只能够检索401错误代码。tastypie发帖验证问题

为了澄清,我能够成功从tastypie api中检索数据。

附件是代码片段,也许有人可以帮助我摆脱这种情况。 在我开始之前,有一点背景:我正在使用自定义授权类。

class CustomAuthorization(Authorization): 
     def is_authorized(self, request, object=None): 
      if request.user.username == 'custom_user': 
       return True 
      return False 

下面是实际的资源:

class CustomObjectResource(ModelResource): 
     class Meta: 
      queryset = CustomObject.objects.all() 
      authentication = ApiKeyAuthentication() 
      authorization = CustomAuthorization() 
      list_allowed_methods = ['get', 'post', ] 
      detail_allowed_methods = ['get', 'post', 'put'] 
      include_resource_uri = False 
      resource_name = 'customobject' 
      always_return_data = True 


     def obj_create(self, bundle, request=None, **kwargs): 
      try: 
       print "request" 
      except: 
       raise BadRequest('I couldnt save your information.') 
      return True 

我知道obj_create方法是假的,但它仍然应该叫,做一些事情,或者是这已经是问题?

以下curl命令用于将数据发布到tastypie API。

curl --dump-header - -H "Content-Type: application/json" -X POST --data '{"body": "This will prbbly be my lst post.", "pub_date": "2011-05-22T00:46:38", "slug": "another-post", "title": "Another Post"}' http://local.com:8000/api/v1/customobject/?format=json&username=custom_user&api_key=123456789

api_key是正确的,但在这种情况下是假的!

如前所述,获取方法的工作原理,但职位只是不会工作。

任何人都有关于如何解决这个问题或有一个解决方法的想法?

回答

1

我会尝试一些事情来调试这个问题。

1)尝试添加:allowed_methods = ['get', 'post', 'put']

2)由于request.user.username是不同的添加打印语句在custom_authorization检查是否导致该问题。

3)做(2)APIKeyAuthentication的源头。

这应该足以让您调试问题。 记得删除打印报表一旦完成!

祝你好运。

+0

为什么不恰当地使用记录模块?它具有实际“打印”信息的能力,或根据日志记录配置执行其他任何操作(例如,在生产环境中完全忽略调试日志记录,但保留更高级别的日志记录)。 – Tadeck 2012-07-26 02:33:04

+0

当然,这就是我使用的。但是如果这个人需要快速调试而不需要进行设置,他可以使用打印语句 – nknj 2012-07-26 02:50:46

+0

感谢您的输入。它实际上比这更令人困惑。正如所建议的那样,我在允许的方法中添加了“put”,但它仍然不起作用。我使用身份验证和授权层进行了更多的工作。我固定这两个,现在它的工作。 – Wurzelgogerer 2012-08-03 18:18:41

0

这可能是由于已知的issue。在此刻的背景tastypie将POST转换为PUT,而Nikunj自从在list_allowed_methods中指出您没有PUT POST也被阻止了......不确定是否存在这种情况,因为在这种情况下您应该得到不允许的方法。我会建议在“is_authorized”方法中调试,并检查那里发生了什么。