2016-11-21 5 views
0

이것은 꽤 오래 동안 나를 괴롭 히고 있습니다. 장고에 api의 기본 세트를 설치했고 angularJS 기반의 프론트 엔드를 구축하고 있습니다. 그러나 몇 가지 이상한 이유로 다음 코드는 CORS 오류를 발생시킵니다.angularjs가 내 장고 기반 apis에 CORS 오류를주는 POST를하지 않습니다.

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); 
     } 
    ); 

난 내가 게시 무엇을 : 옵션 요청이 포스트 둘째 없음을 할 경우에도 게시되어 두 가지를 발견했다. 나는 요청을 넣으려고. 포스 내용과 비어 있습니다.

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 

그리고 이것은 내 서버 코드입니다 : 나는 django-cors-headers를 설치하고 모든 코어에 지시하지만 여전히 작동하지를 따랐습니다

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



    data = auth.login(emailAddress, password) 

    return data 

...

+1

귀하의 서버 코드를 게시하십시오. 내부에서'OPTION' 메소드를 받아들입니다. ' – itzMEonTV

+0

서버 코드를 추가했습니다. POST를 확인하고 있습니다. 어떻게 OPTION 메서드를 사용할 수 있습니까? 요청의 pp.pprint를 수행합니다. POST는 빈 dict 객체를 출력합니다. – Ali

+1

수용 할 요청 (POST, GET ...)과 받아 들일 수있는 대상을 서버에 알려줘야합니다. 그것들은 당신이 설정해야하는 2 개의 헤더입니다. 그들을 세웠어? – trichetriche

답변

1

OPTION 요청은 POST 요청을 보낼 수 있는지 여부에 관계없이 브라우저에서 안전을 위해 작업을 수행합니다 (교차 도메인의 경우). 헤더가있는 200을 반환해야합니다 (추가 한 경우 cors-headers 미들웨어가 처리됩니다). 그래서 서버에서는 POST 요청을 수락합니다 (함수 기반보기로 가정).

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

POST에서 허용되는 사항이 없습니다. – Ali

+0

@Ali, 'OPTION'요청이 수행 중입니다. 'POST '요청 (크로스 도메인의 경우)을 보낼 수 있는지 여부를 브라우저가 안전하게 확인합니다. – itzMEonTV

+0

예치가 문제를 발견했습니다. :) 도움을 주신 덕분입니다. – Ali

2

문제는 라인에 있습니다 올릴 것이다

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"] :

이 라인의 장소에서
emailAddress = request.POST["emailAddress"] 

는,이 코드를 사용 'emailAddress'가 request.POST에없는 경우 KeyError 예외입니다.

request.POST.get ('emailAddress')은 'emailAddress'가 request.POST에없는 경우 None을 반환합니다.

+0

실제 값으로 게시물 요청을하고 있는데도 아무 것도 게시하지 않아도 문제가 있습니다. 위의 코드는 emailAddress를 None으로 설정합니다. – Ali

+1

@Ali 내 대답 업데이트. 지금 확인하십시오. –

+0

다른 문제가 발생한 곳을 표시하지만 암울합니다.프론트 엔드에서 POST 요청을하고 있지만 백엔드에서 OPTIONS 요청으로 처리하므로 위의 업데이트 된 코드는 결코 실행되지 않습니다. request.method는 OPTIONS를 일부 이상한 이유로 동일하게 처리합니다. – Ali

0

발견 된 문제 - 멍청한 실수였습니다.

내 가상 환경에서 장고 내 버전은 그래서 설정에서 MIDDLEWARE 옵션 MIDDLEWARE_CLASSES라는 이름으로했다 나는 버전 1.10에서 프로젝트를 생성 한 반면 1.9 - 감사 모두를위한 - 바보 같은 실수는 저를 이틀 동안 갇혀 있었다 모든 답변 :)

+0

당신은 당신의 자신의 대답을 받아 들일 수 있습니다. – r3ign