有人可能已经问过我的问题,但我找不到任何建议。
我编写的Android应用需要使用Django
访问我的HttpsURLConnection
服务器,然后Django
服务器会将JSON
数组返回给Android。
Django
中的视图函数将从request.POST接收参数并生成JSON
数组,然后使用HTTPResponse
Django方法返回。它不需要任何模板和表单。
当我从Android调用Django
视图函数时,它会返回403错误。我知道这是因为POST数据不包含" csrf_token"。
我的问题是:如何获得" csrf_token"并在将其发送到Django
之前将其放入我的POST数据中?我尝试通过" @ csrf_exempt"禁用CSRF检查。它可以将正确的结果返回给Android应用,但我不会禁用CSRF检查。
谢谢, 威尔逊
答案 0 :(得分:0)
您必须发送Cookie并且还必须使用csrftoken发送标题“X-CSRFToken”。
这就是我所做的(可能不是最好的方式):
通过get请求获取csrf令牌。但首先尝试通过使用开发人员工具在浏览器上执行相同的请求来查看是否获得了csrftoken cookie。如果没有,你应该使用ensure_csrf_cookie decorator
from django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie
def your_view(request):
pass
现在使用相同的HttpUrlConnection对象执行以下操作:
String cookieString="";
String csrftoken="";
// The below code can be shortened using for-each loop
List<HttpCookie> cookies=cookieManager.getCookieStore().getCookies();
Iterator<HttpCookie> cookieIterator=cookies.iterator();
while(cookieIterator.hasNext()){
HttpCookie cookie=cookieIterator.next();
cookieString+=cookie.getName()+"="+cookie.getValue()+";";
if(cookie.getName().equals("csrftoken")){
csrftoken=cookie.getValue();
}
}
将以下内容添加到您的帖子请求中:
urlConnection.setRequestProperty("X-CSRFToken", csrftoken);
urlConnection.setRequestProperty("Cookie", cookieString);