【问题标题】:Android Calling Django Server With POST DataAndroid 使用 POST 数据调用 Django 服务器
【发布时间】:2015-12-27 19:26:09
【问题描述】:

可能有人已经问过我的问题,但我找不到任何建议。

我编写了一个 Android 应用程序,它需要使用 HttpsURLConnection 访问我的 Django 服务器,然后 Django 服务器将向 Android 返回一个 JSON 数组。

Django 中的视图函数将从 request.POST 接收参数并生成JSON 数组,然后使用HTTPResponse Django 方法返回。它不需要任何模板和表格。

当我从 Android 调用 Django 视图函数时,它返回 403 错误。我知道这是因为 POST 数据不包含“csrf_token”。

我的问题是:在发送到Django 之前,如何获取“csrf_token”并将其放入我的 POST 数据中?我尝试通过“@csrf_exempt”禁用 CSRF 检查,它可以将正确的结果返回给 Android 应用,但我不会禁用 CSRF 检查。

谢谢, 威尔逊

【问题讨论】:

标签: android django


【解决方案1】:

您必须发送 cookie,还必须发送带有 csrftoken 的标头“X-CSRFToken”。

这就是我所做的(可能不是最好的方式):

  1. 通过获取请求获取 csrf 令牌。但首先尝试通过在浏览器上使用开发者工具执行相同的请求来查看是否获取 csrftoken cookie。如果没有,你应该使用 ensure_csrf_cookie 装饰器

    from django.views.decorators.csrf import ensure_csrf_cookie
    @ensure_csrf_cookie
    def your_view(request):
        pass
    
  2. 现在使用相同的 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();
        }
    }
    
  3. 将以下内容添加到您的发布请求中:

    urlConnection.setRequestProperty("X-CSRFToken", csrftoken);
    urlConnection.setRequestProperty("Cookie", cookieString);
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 2017-05-03
    • 2020-04-13
    • 2018-11-18
    相关资源
    最近更新 更多