Estou tentando processar solicitações JSON / Ajax recebidas com Django / Python.
request.is_ajax()
está True
na solicitação, mas não tenho idéia de onde está a carga útil com os dados JSON.
request.POST.dir
contém o seguinte:
['__class__', '__cmp__', '__contains__', '__copy__', '__deepcopy__', '__delattr__',
'__delitem__', '__dict__', '__doc__', '__eq__', '__ge__', '__getattribute__',
'__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__',
'__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__setitem__', '__str__', '__weakref__', '_assert_mutable', '_encoding',
'_get_encoding', '_mutable', '_set_encoding', 'appendlist', 'clear', 'copy', 'encoding',
'fromkeys', 'get', 'getlist', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues',
'keys', 'lists', 'pop', 'popitem', 'setdefault', 'setlist', 'setlistdefault', 'update',
'urlencode', 'values']
Aparentemente, não há chaves nas chaves de postagem de solicitação.
Quando olho para o POST no Firebug , há dados JSON sendo enviados na solicitação.
len(request.POST)
erequest.POST.items()
também ajudaria.Respostas:
Se você está postando JSON no Django, acho que você deseja
request.body
(request.raw_post_data
no Django <1.4). Isso fornecerá os dados JSON brutos enviados pela postagem. A partir daí, você pode processá-lo ainda mais.Aqui está um exemplo usando JavaScript, jQuery , jquery-json e Django.
JavaScript:
Django:
Django <1.4:
fonte
self.client.post('/event/save-json/', json.dumps(python_dict), HTTP_X_REQUESTED_WITH='XMLHttpRequest', content_type="application/json")
Eu tive o mesmo problema. Eu estava postando uma resposta JSON complexa e não conseguia ler meus dados usando o dicionário request.POST.
Meus dados JSON POST eram:
Nesse caso, você precisa usar o método fornecido pelo aurealus. Leia o request.body e desserialize-o com o json stdlib.
fonte
json_data = simplejson.loads(request.raw_post_data)
tem certeza de que foi afirmado corretamente?django.utils.simplejson
foi removido nas versões recentes. Basta usar ajson
biblioteca stdlib .Método 1
Cliente: Enviar como
JSON
Servidor :
Método 2
Cliente: Enviar como
x-www-form-urlencoded
(Nota:
contentType
eprocessData
foram alterados,JSON.stringify
não é necessário)Servidor :
Mudado em 1.5+: https://docs.djangoproject.com/en/dev/releases/1.5/#non-form-data-in-http-requests
Provavelmente relacionado
fonte
django.http.request.RawPostDataException: You cannot access body after reading from request's data stream
É importante lembrar que o Python 3 tem uma maneira diferente de representar seqüências de caracteres - elas são matrizes de bytes.
Usando o Django 1.9 e Python 2.7 e enviando os dados JSON no corpo principal (não um cabeçalho), você usaria algo como:
Mas para o Django 1.9 e o Python 3.4 você usaria:
Acabei de passar por essa curva de aprendizado criando meu primeiro aplicativo Py3 Django!
fonte
request.raw_response
agora está obsoleto. Emrequest.body
vez disso, use para processar dados de formulário não convencionais, como cargas XML, imagens binárias etc.Documentação do Django sobre o assunto .
fonte
no django 1.6 python 3.3
cliente
servidor
fonte
A carga útil do HTTP POST é apenas um monte de bytes simples. O Django (como a maioria das estruturas) o decodifica em um dicionário a partir de parâmetros codificados por URL ou codificação MIME-multipart. Se você apenas despejar os dados JSON no conteúdo do POST, o Django não os decodificará. A decodificação JSON do conteúdo completo do POST (não do dicionário); ou coloque os dados JSON em um wrapper MIME com várias partes.
Em resumo, mostre o código JavaScript. O problema parece estar lá.
fonte
request.raw_post_data
foi descontinuado. Use emrequest.body
vez dissofonte
Algo assim. Funcionou: Solicitar dados do cliente
Solicitar processo no servidor
fonte
fonte
Usando Angular, você deve adicionar um cabeçalho para solicitar ou adicioná-lo aos cabeçalhos de configuração do módulo:
{'Content-Type': 'application/x-www-form-urlencoded'}
fonte
request.POST é apenas um objeto semelhante a um dicionário, portanto, indexe-o com a sintaxe dict.
Supondo que o seu campo de formulário seja fred, você pode fazer algo assim:
Como alternativa, use um objeto de formulário para lidar com os dados do POST.
fonte