Porque o AngularJs, não reconhece este retorno como json?

61 views
Skip to first unread message

Fellipe Henrique

unread,
Apr 18, 2016, 3:39:28 PM4/18/16
to django...@googlegroups.com
Amigos, estou tentando retonar um json.. não posso usar  restframework... precisa sem usar app de terceiros, no máximo o django...

aqui está meu código:
def list_records(request):
    query_set = Cliente.objects.all().order_by('ordem')
    lista = serializers.serialize("json", list(query_set))

    return HttpResponse(json.dumps({"status": "ok", "data": lista}), mimetype='application/json')
ele retorna isto:

[{"pk": 1, "model": "core.cliente", "fields": {"status": "N", "ordem": 2, "detalhes": "linha 1\nlinha 2", "descricao": "adadad", "contas": [], "valor": "123", "dt_lancamento": "2016-01-12"}}, {"pk": 2, "model": "core.cliente", "fields": {"status": "N", "ordem": 2, "detalhes": "linha 1\nlinha 2", "descricao": "adadad", "contas": [], "valor": "123", "dt_lancamento": "2016-01-12"}}]
Mas... o AngularJs, não "reconhece" como sendo json.. porque eu não consigo pegar os dados por ele...

Alguma idéia do que pode estar acontecendo?

T.·.F.·.A.·.     S+F
Fellipe Henrique P. Soares

e-mail: > echo "lkrrovknFmsgor4ius" | perl -pe \ 's/(.)/chr(ord($1)-2*3)/ge'
Twitter: @fh_bash

Gustavo Carvalho

unread,
Apr 18, 2016, 3:56:39 PM4/18/16
to django...@googlegroups.com

--
Você recebeu essa mensagem porque está inscrito no grupo "Django Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para django-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Gustavo de Carvalho Sales
http://gtsalles.com.br/

'A Livre expressão é o que constrói uma nação independentemente da moeda e sua cotação'

Rafael Henter

unread,
Apr 18, 2016, 4:32:13 PM4/18/16
to django...@googlegroups.com
Felipe,

O seu JSON está válido. Qual o erro que o AngularJS recebe ? Já verificou se o problema é CORS?

Abraço,

Rafael Henter

--

Sinval Júnior

unread,
Apr 19, 2016, 7:59:59 AM4/19/16
to django...@googlegroups.com
Como você esta lendo este json pelo angular? Monitore a requisição pelo firebug.

Ao encaminhar esta mensagem, por favor:
1 - Apague meu endereço eletrônico;
2 - Encaminhe como Cópia Oculta (Cco ou BCc) aos seus destinatários. Dificulte assim a disseminação de vírus, spams e banners.

#=================================================================+
#!/usr/bin/env python
nome = 'Sinval Júnior'
email = 'sinvalju arroba gmail ponto com'
print nome
print email
#==================================================================+

Fellipe Henrique

unread,
Apr 19, 2016, 8:12:37 AM4/19/16
to django...@googlegroups.com
Olá amigos,

O AngularJS, não retorna erro algum.. por isso estou achando estranho... mesmo mudando para content_type... continua a mesma coisa..

No firebug retorna o json que eu passei antes.. e estou usando assim no angular:

$scope.getLista = function () {
$http.get('/api/get/').then(function (result) {
$scope.lista_dados = result.data;
$scope.lista_loaded = true;
console.log($scope.lista_dados);

}, function (err) {
$scope.sem_dados = true;
$scope.lista_loaded = true;
console.error(err);
}
);
};

E no HTML assim:
<tr ng-repeat=" i in lista_dados">
<td>{$ i.pk $}</td>
<td>{$ i.fields.descricao $}</td>
<td>Editar / Excluir</td>
</tr>
O que eu acho estranho é que.. quando "escapo" o lista_dados no console, o  browser não "reconhece" como json, exibe como se fosse uma string... porque quando ele reconhece, ele "monta" o json para ser visualizado corretamente...

Realmente não estou entendendo.. já que o json é válido..


T.·.F.·.A.·.     S+F
Fellipe Henrique P. Soares

e-mail: > echo "lkrrovknFmsgor4ius" | perl -pe \ 's/(.)/chr(ord($1)-2*3)/ge'
Twitter: @fh_bash

Diego Maia

unread,
Apr 19, 2016, 8:17:42 AM4/19/16
to django...@googlegroups.com
É uma forçação de barra mas faz JSON.parse($scope.lista_dados) que ele irá te devolver como json
Diego Maia
Analista de Sistemas
(85) 8155.2033 (vivo)
(85) 8576.8789 (oi)

Fellipe Henrique

unread,
Apr 19, 2016, 8:25:12 AM4/19/16
to django...@googlegroups.com
Eu havia tentado isso, mas fala que o json está incorreto.. linha 1 coluna 2.... rsrsrs... mas se eu pegar o json e validar ele tá válido... tá muito estranho isso...

Fábio Cerqueira

unread,
Apr 19, 2016, 8:36:40 AM4/19/16
to django Brasil
Fellipe,  o que retorna no console.log(data); ali no then?

--
Você recebeu essa mensagem porque está inscrito no grupo "Django Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para django-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Fábio Cerqueira

Fellipe Henrique

unread,
Apr 19, 2016, 8:39:54 AM4/19/16
to django...@googlegroups.com

2016-04-19 9:36 GMT-03:00 Fábio Cerqueira <stee...@gmail.com>:
Fellipe,  o que retorna no console.log(data); ali no then?
[{"pk": 1, "model": "core.cliente", "fields": {"status": "N", "ordem": 2, "detalhes": "linha 1\nlinha 2", "descricao": "adadad", "contas": [], "valor": "123", "dt_lancamento": "2016-01-12"}}, {"pk": 2, "model": "core.cliente", "fields": {"status": "N", "ordem": 2, "detalhes": "linha 1\nlinha 2", "descricao": "adadad", "contas": [], "valor": "123", "dt_lancamento": "2016-01-12"}}]
Retorna como se fosse uma string... não como json, acredito eu... porque o firefox não "monta" ele como um json normal...

Tentei assim também:


query_set = Caixa.objects.all().order_by('dt_lancamento').values()
list_result = [entry for entry in query_set]


return HttpResponse(simplejson.dumps(list_result), content_type='application/json')

Aí me retorna: Decimal('123') is not JSON serializable

Tá complicado... rsrsrs.. tentei mudar do json, pro simplejson e mesma coisa...

Fred Chevitarese

unread,
Apr 19, 2016, 8:41:48 AM4/19/16
to django...@googlegroups.com



"
São os homens que mais me surpreendem na humanidade. Porque perdem a saúde para juntar dinheiro, depois perdem dinheiro para recuperar a saúde. E por pensarem ansiosamente no futuro, esquecem do presente de tal forma que acabam por não viver nem o presente nem o futuro. E vivem como se nunca fossem morrer e morrem como se nunca tivessem vivido” - Dalai Lama.
"

Fred Chevitarese - GNU/Linux



--

Rodrigo Otávio Passos Ferreira

unread,
Apr 19, 2016, 8:45:03 AM4/19/16
to django...@googlegroups.com

se tiver no django acima de 1.8 tenta:

 

from django.http import JsonResponse

..

..

list_result = Caixa.objects.all().order_by('dt_lancamento').values()

return JsonResponse(list(list_result),safe=False)

 

> 2016-04-19 9:36 GMT-03:00 Fábio Cerqueira <stee...@gmail.com>:

> > Fellipe, o que retorna no console.log(data); ali no then?

>

> [{"pk": 1, "model": "core.cliente", "fields": {"status": "N", "ordem":

> 2, "detalhes": "linha 1\nlinha 2", "descricao": "adadad", "contas":

> [], "valor": "123", "dt_lancamento": "2016-01-12"}}, {"pk": 2,

> "model": "core.cliente", "fields": {"status": "N", "ordem": 2,

> "detalhes": "linha 1\nlinha 2", "descricao": "adadad", "contas": [],

> "valor": "123", "dt_lancamento": "2016-01-12"}}]

>

> ​

> Retorna como se fosse uma string... não como json, acredito eu... porque o

> firefox não "monta" ele como um json normal...

>

> Tentei assim também:

>

>

> query_set = Caixa.objects.all().order_by('dt_lancamento').values()

> list_result = [entry for entry in query_set]

>

>

> return HttpResponse(simplejson.dumps(list_result),

> content_type='application/json')

>

>

> Aí me retorna: Decimal('123') is not JSON serializable

>

> Tá complicado... rsrsrs.. tentei mudar do json, pro simplejson e mesma

> coisa...

>

>

>

> T.·.F.·.A.·. S+F

> *Fellipe Henrique P. Soares*

>

> e-mail: > echo "lkrrovknFmsgor4ius" | perl -pe \ 's/(.)/chr(ord($1)-2*3)/ge'

signature.asc

Fellipe Henrique

unread,
Apr 19, 2016, 8:46:28 AM4/19/16
to django...@googlegroups.com


Esqueci um pequeno detalhe... estou usando uma versão antiga do Django 1.4.19, que não tem essa classe, por isso estou tentando via  "normal" mesmo..

P.S.: não posso atualizar agora o django..

Sinval Júnior

unread,
Apr 19, 2016, 10:17:56 AM4/19/16
to django...@googlegroups.com
Acredito que seu problema seja na hora que atribuir $scope.lista_dados = result.data, na estrutura do seu json você recebe um array de uma posição, que por sua vez contem outro array de 2 posições. Ou seja nunca irá conseguir acessar a chave pk no loop da view. 
Tente isso:

$scope.lista_dados = result.data[0]

Dica: cole o seu json aqui[1] e irá entender melhor







Ao encaminhar esta mensagem, por favor:
1 - Apague meu endereço eletrônico;
2 - Encaminhe como Cópia Oculta (Cco ou BCc) aos seus destinatários. Dificulte assim a disseminação de vírus, spams e banners.

#=================================================================+
#!/usr/bin/env python
nome = 'Sinval Júnior'
email = 'sinvalju arroba gmail ponto com'
print nome
print email
#==================================================================+

Gilson Filho

unread,
Apr 19, 2016, 10:25:40 AM4/19/16
to Django Brasil
Antes de mais nada, nos passe a resposta com os headers por favor. Primeiro precisamos confirmar se realmente a resposta veio no formato JSON. Estando certo disso, partimos somente para o AngularJS. Caso contrário, focamos na resposta no Django.

Fellipe Henrique

unread,
Apr 19, 2016, 12:57:49 PM4/19/16
to django...@googlegroups.com
Aqui está o header:

Content-Type: application/json
Date: Tue, 19 Apr 2016 16:50:42 GMT
Server: WSGIServer/0.1 Python/2.7.11

Mesmo passando: #scope.lista = result.data[0], não funciona...

Realmente não sei mais o que pode ser...

Ele chega assim:

Inline image 1

Como podem ver, ele vem em uma string.. onde deveria vir um Object, contendo cada registro do json..



T.·.F.·.A.·.     S+F
Fellipe Henrique P. Soares

e-mail: > echo "lkrrovknFmsgor4ius" | perl -pe \ 's/(.)/chr(ord($1)-2*3)/ge'
Twitter: @fh_bash

2016-04-19 9:54 GMT-03:00 Gilson Filho <m...@gilsondev.in>:
Antes de mais nada, nos passe a resposta com os headers por favor. Primeiro precisamos confirmar se realmente a resposta veio no formato JSON. Estando certo disso, partimos somente para o AngularJS. Caso contrário, focamos na resposta no Django.

--

Fellipe Henrique

unread,
Apr 19, 2016, 1:08:32 PM4/19/16
to django...@googlegroups.com
Consegui resolver!

O problema estava no return, onde eu mandava o simplejson.dumps... removi ele, e o json está chegando corretamente.. ficando assim:

query_set = Cliente.objects.all()

lista = serializers.serialize("json", list(query_set))

return HttpResponse(lista, content_type='application/json')
Indo mais a fundo o serialize, já retorna o json.. e dumps jogava ele dentro de "outro" json....

Valeu pessoal!

T.·.F.·.A.·.     S+F
Fellipe Henrique P. Soares

e-mail: > echo "lkrrovknFmsgor4ius" | perl -pe \ 's/(.)/chr(ord($1)-2*3)/ge'
Twitter: @fh_bash

Rayan Sóstenes

unread,
Apr 21, 2016, 3:59:14 AM4/21/16
to django...@googlegroups.com
Só pra complementar, não retorne JSON como o "top level" sendo um array é um risco de segurança.

Muitos frameworks já não permitem isso.

--
*Rayan Sóstenes Alves Gama da Motta*
*Analista de Sistemas*
*Graduando em Eng. de Controle e Automação*
*Cel: (62) 8248-4091*

Fábio Cerqueira

unread,
Apr 21, 2016, 8:23:14 PM4/21/16
to django Brasil
Muito bom, Rayan. Não conhecia essa falha :D
Fábio Cerqueira

Fabio C. Barrionuevo da Luz

unread,
Apr 21, 2016, 8:34:27 PM4/21/16
to django...@googlegroups.com
Rayan, Não conhecia essa falha.

Você poderia criar um exemplo simples de um JSON errado e o JSON correto.
Acho que deixaria o tópico mais completo....

Fábio C. Barrionuevo da Luz
Palmas - Tocantins - Brasil - América do Sul


Blog colaborativo sobre Python e tecnologias Relacionadas, mantido totalmente no https://github.com/pythonclub/pythonclub.github.io .

Todos são livres para publicar. É só fazer fork, escrever sua postagem e mandar o pull-request. Leia mais sobre como publicar em README.md e contributing.md.
Regra básica de postagem:
"Você" acha interessante? É útil para "você"? Pode ser utilizado com Python ou é útil para quem usa Python? Está esperando o que? Publica logo, que estou louco para ler...

Rayan Sóstenes

unread,
Apr 22, 2016, 2:19:13 PM4/22/16
to django...@googlegroups.com
O exploit combina "Cross Site Request Forgery" (CSRF) com um hack no JSON Array, que permite que um site mal intensionado capturar informações do usuário sem que este suspeite de nada. O hack envolve redefinir o construtor do Array, o que é permitido no java script.

Vamos descrever um ataque passo a passo:

Imagine que você esta logado no seu sistema. O sistema usa Ajax que faz requisições GET para uma api:


Esta api retorna dados sensiveis de clientes no seguinte formato

    [
        {
            "id":"1",
            "nome":"Fulano de Tal"
            ...
        }
    ]

você precisa estar logado no seu sistema para acessar essa API, mas suponha que estando logado você abra outra aba e visite o site hacker.com que na <HEAD> tem o seguinte código:


<script>
var clientes;

Array = function() {
  clientes = this;
};
</script>


<script>
    // Aqui e variável clientes tem todos os dados retornados pela sua api
    // eu poderia enviar ao meu servidor por exemplo
    console.log("Eu roubei seus dados", clientes);
    
</script>

o correto nesse caso seria sua api sempre retornar um objeto:

    {
        "data":[
            {
                "id":"1",
                "nome":"Fulano de Tal"
                ...
            }
        ]
    }


Reply all
Reply to author
Forward
0 new messages