2016-11-21 1 views
0

Cela me tourmente depuis un certain temps maintenant. J'ai mis en place un jeu de base d'API dans Django et je construis un frontal basé sur angularJS. Cependant, pour une raison étrange, le code suivant entraîne une erreur CORS.angularjs ne POST pas à mon django basé apis - donnant erreur CORS

var req = { 
    method: 'POST', 
    url: url, 
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}, 
    withCredentials: true, 
    param: data, 
    data: data 
} 

return $http(req).then(
     function(response){ 
      callbackSuccess(response); 
     }, 
     function(response){ 
      callbackError(response); 
     } 
    ); 

j'ai découvert deux choses que quand je fais un poste une demande OPTIONS est faite et d'autre part, rien de ce que je poste est encore affichée. J'essaie de mettre le contenu request.POST et son vide.

Internal Server Error: /api/users/auth/ 
Traceback (most recent call last): 
    File "/home/ali/eb-virt/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 149, in get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "/home/ali/eb-virt/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 147, in get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "/home/ali/eb-virt/local/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view 
    return view_func(*args, **kwargs) 
    File "/home/ali/eb-virt/local/lib/python2.7/site-packages/django/utils/decorators.py", line 149, in _wrapped_view 
    response = view_func(request, *args, **kwargs) 
    File "/home/ali/Projects/api.project.local/project/api/views.py", line 50, in loginUser 
    emailAddress = request.POST["emailAddress"] 
    File "/home/ali/eb-virt/local/lib/python2.7/site-packages/django/utils/datastructures.py", line 85, in __getitem__ 
    raise MultiValueDictKeyError(repr(key)) 
MultiValueDictKeyError: "'emailAddress'" 
[21/Nov/2016 07:56:59] "OPTIONS /api/users/auth/ HTTP/1.1" 500 81083 

Et voici mon code serveur:

def loginUser(request): 
    emailAddress = '' 
    password = '' 
    emailAddress = request.POST["emailAddress"] 
    password = request.POST["password"] 



    data = auth.login(emailAddress, password) 

    return data 

J'ai installé le django-cors-headers et suivi toutes les instructions au noyau, mais sa ne fonctionne toujours pas ...

+1

postez votre code serveur. vous acceptez la méthode 'OPTION' dans la vue. ' – itzMEonTV

+0

J'ai ajouté le code du serveur - je vérifie POST - comment puis-je accepter la méthode OPTION? faire un pp.pprint de la request.POST sort un objet dict vide – Ali

+1

Vous devez dire à votre serveur quelles requêtes accepter (POST, GET ...) et aussi de qui il peut accepter. Ce sont 2 en-têtes que vous devez définir. Les avez-vous mis en place? – trichetriche

Répondre

1

OPTION demande est faire par votre navigateur pour une sécurité s'il peut envoyer une requête POST (en cas de cross-domaine). Il devrait retourner un 200 avec quelques en-têtes (se chargera du middleware cors-headers si vous l'avez ajouté). Donc, dans le serveur, acceptez POST de cette manière (en supposant des vues basées sur les fonctions).

if request.method == 'POST': 
    #access POST variables here. 
+0

Cest la chose rien n'est accepté dans le POST – Ali

+0

@Ali, demande 'OPTION' fait par votre navigateur pour une sécurité s'il peut envoyer une requête POST (dans le cas d'un domaine croisé). – itzMEonTV

+0

Vous avez trouvé que le problème est survenu :) merci pour l'aide – Ali

2

Le problème est en ligne:

emailAddress = request.POST["emailAddress"] 

Au lieu de cette ligne, utilisez ce code:

def loginUser(request): 

    if request.method == 'POST': 
    emailAddress = request.POST.get('emailAddress') 
    password = request.POST.get('password') 

    data = auth.login(emailAddress, password) 

    return data 

request.POST [ "emailAddress"] soulèvera une exception KeyError si 'emailAddress' n'est pas dans request.POST.

Alors que request.POST.get ('emailAddress') renverra None si 'emailAddress' n'est pas dans request.POST.

+0

C'est le problème même si je fais cela rien n'est POSTED même si je fais une demande de poste avec des valeurs réelles. Le code ci-dessus définit emailAddress sur None. – Ali

+1

@Ali Mis à jour ma réponse.Veuillez vérifier maintenant. –

+0

Noté mais heres où un autre problème se produit.à partir de l'extrémité frontale, je fais une requête POST mais à l'extrémité arrière elle est traitée comme une requête OPTIONS donc le code mis à jour ci-dessus n'est jamais exécuté car request.method est égal à OPTIONS pour une raison étrange. – Ali

0

Trouvé le problème - était une erreur noob totale.

Ma version de Django dans mon environnement virtuel était 1.9 alors que j'avais généré le projet à partir d'une version 1.10 donc dans les paramètres l'option MIDDLEWARE devait être nommée MIDDLEWARE_CLASSES - erreur stupide m'avait bloqué pendant deux jours - merci à tous pour toutes vos réponses :)

+0

Vous pouvez accepter votre propre réponse. – r3ign