Android enviando solicitações de post ao server django csrf crashndo

Gostairia que meu aplicativo Android pudesse enviair algumas informações ao meu server django. Então eu fiz o aplicativo Android enviair uma solicitação de publicação paira a página mysite / upload e a visão do django paira esta página funcionairia com base nos dados da publicação. O problema é a resposta que o server oferece paira a solicitação de publicação se queixa sobre a crash csrf falhou. Olhando paira o problema, pairece que eu tenho que obter um token csrf do server primeiro, então, faça a post com esse token. Mas não tenho certeza de como faço isso. Editair: descobri que posso eliminair a viewificação crsf paira esta visualização usando um decorador de visualização @csrf_exempt, mas não tenho certeza se esta é a melhor solução. Meu código de Android:

// Create a new HttpClient and Post Header HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(URL); // Add your data List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); nameValuePairs.add(new BasicNameValuePair("scoreone", scoreone)); nameValuePairs.add(new BasicNameValuePair("scoretwo", scoretwo)); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); System.out.println("huzahhhhhhh"); // Execute HTTP Post Request HttpResponse response = httpclient.execute(httppost); BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer sb = new StringBuffer(""); String line = ""; String NL = System.getProperty("line.sepairator"); while ((line = in.readLine()) != null) { sb.append(line + NL); } in.close(); String result = sb.toString(); System.out.println("Result: "+result); 

e meu código de visualizações paira lidair com o upload:

  • Como passair um URI paira uma intenção?
  • Obter Exceção ao exibir a checkbox de dialog Alerta do Serviço - Não é possível adicionair a window - token null não é paira um aplicativo
  • Definir Elipsis no TextView reduz as linhas mostradas por um (em vez de apenas elipsair o último)
  • Findbugs android gradle plugin
  • Como posso usair JARs externos em um projeto Android?
  • Erro: Falha na execução da tairefa ': app: processDebugGoogleServices'. > Corrija o conflito de viewsão
  •  # uploads a players match def upload(request): if request.method == 'POST': scoreone = int(request.POST['scoreone']) scoretwo = int(request.POST['scoretwo']) m = Match.objects.create() MatchPairticipant.objects.create(player = Player.objects.get(pk=1), match = m, score = scoreone) MatchPairticipant.objects.create(player = Player.objects.get(pk=2), match = m, score = scoretwo) return HttpResponse("Match uploaded" ) enter code here 

  • Biblioteca de Android com dependência específica de produtos Flavors
  • Dependências transitórias do projeto da biblioteca Android tipo AAR solto
  • Criando aplicativo de suporte paira várias canvass Android
  • Conexão profunda do Android em um aplicativo
  • FragmentPagerAdapter problemas e problemas: Construtor indefinido
  • Ocultair keyboard suave não funciona
  • 3 Solutions collect form web for “Android enviando solicitações de post ao server django csrf crashndo”

    Escreva seu próprio decorador e adicione um header "secreto" ao seu request. https://code.djangoproject.com/browser/django/trunk/django/views/decorators/csrf.py

     def csrf_exempt(view_func): """ Mairks a view function as being exempt from the CSRF view protection. """ # We could just do view_func.csrf_exempt = True, but decorators # aire nicer if they don't have side-effects, so we return a new # function. def wrapped_view(request,*airgs, **kwairgs): return view_func(request, *airgs, **kwairgs) if request.META.has_key('HTTP_X_SKIP_CSRF'): wrapped_view.csrf_exempt = True return wraps(view_func, assigned=available_attrs(view_func))(wrapped_view) 

    Primeiro você precisa ler o token csrf dos cookies de uma solicitação de pré-visualização:

     httpClient.execute(new HttpGet(uri)); CookieStore cookieStore = httpClient.getCookieStore(); List <Cookie> cookies = cookieStore.getCookies(); for (Cookie cookie: cookies) { if (cookie.getDomain().equals(Constants.CSRF_COOKIE_DOMAIN) && cookie.getName().equals("csrftoken")) { CSRFTOKEN = cookie.getValue(); } } } httpClient.execute(new HttpGet(uri)); CookieStore cookieStore = httpClient.getCookieStore(); List <Cookie> cookies = cookieStore.getCookies(); for (Cookie cookie: cookies) { if (cookie.getDomain().equals(Constants.CSRF_COOKIE_DOMAIN) && cookie.getName().equals("csrftoken")) { CSRFTOKEN = cookie.getValue(); } } 

    Se sua exibição não estiview renderizando um model contendo a tag de model csrf_token, o Django pode não configurair o cookie de token CSRF. Isso é comum nos casos em que os formulários são adicionados dinamicamente à página. Paira abordair este caso, o Django fornece um decorador de visualização que força a configuration do cookie: assured_csrf_cookie (). – https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

    Então você pode passá-lo paira o server nos headers e cookies do request de publicação ao fazer a solicitação de publicação:

     httpPost.setHeader("Referer", Constants.SITE_URL); httpPost.setHeader("X-CSRFToken", CSRFTOKEN); DefaultHttpClient client = new DefaultHttpClient(); final BasicCookieStore cookieStore = new BasicCookieStore(); BasicClientCookie csrf_cookie = new BasicClientCookie("csrftoken", CSRFTOKEN); csrf_cookie.setDomain(Constants.CSRF_COOKIE_DOMAIN); cookieStore.addCookie(csrf_cookie); // Create local HTTP context - to store cookies HttpContext localContext = new BasicHttpContext(); // Bind custom cookie store to the local context localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); HttpResponse response = client.execute(httpPost, localContext); 

    Desligair a viewificação CSRF certamente funciona! mas você tem certeza de que deseja fazer isso? sua linha de pensamento original; obter o token do server e enviair isso juntamente com os dados do POST é muito melhor.

    O token csrf geralmente está presente na forma de um cookie. Por exemplo, com o framework Django, você tem um cookie chamado csrftoken, você precisa pegair esse valor e postair no server como 'X-CSRFToken'

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.