iPhone发布到Django并获得CSRF验证失败

时间:2011-12-13 10:23:21

标签: iphone django post django-csrf

我从iPhone发送POST请求到Django并获得“CSRF验证失败”,这是我无法理解的。 我试图通过互联网找到一个很好的解决方案,但我不能。 是否有任何简单的方法来发送到django?

这是我的代码:

   NSString *post =[NSString stringWithFormat:@"s=aaa&r=k&c=gg"];
NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:(@"http://localhost:8000/messages/views/")]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];
NSError *error;
NSURLResponse *response;
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString *data=[[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
NSLog(data);

2 个答案:

答案 0 :(得分:8)

我错了还是在本机应用上使用它没有意义?

在这种情况下,您可以使用此装饰器禁用此保护:

from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
  def view_without_csrf_protection(request):
    pass

答案 1 :(得分:3)

通常这归结为正确设置标题。 an answer已经详细说明了这一点。您需要的相关部分是:

xhr.setRequestHeader("X-CSRFToken", token)

有关从Cookie中获取令牌的详细信息,请参阅链接的答案,为简洁起见,我没有从那里复制它。我真的不知道你的代码的上下文,所以这种检索方法可能不会直接应用。无论如何,你需要以某种方式获得令牌。

获得令牌后,请向NSMutableURLRequest添加标头。发布请求后,错误应该消失。

[request addValue:token forHTTPHeaderField:@"X-CSRFToken"];