2013-06-22 3 views
7

저는 작업중인 개인 프로젝트에 대해 백스텝과 jQuery로 Flask를 사용하고 있습니다. 내가 그들의 이름 또는 암호 내/로그인 경로는 다음과 같습니다 백엔드에Flask 및 jQuery를 사용하여 리디렉션하는 방법

등 잘못된 사용자에게 것 errorFuction에서

$.ajax({ 
    type: "POST", 
    data: JSON.stringify(body), //username and password 
    contentType: 'application/json; charset=utf-8', 
    url: "/login", 
    success: successFunction, 
    error: errorFunction, 
    complete: completeFunction 
}); 

:

것은 내가이 작업을 수행 할 수 로그인

@app.route("/login", methods=['GET', 'POST']) 
def login(): 
    if(request.method == "POST"): 
     #retrieve the username and password sent 
     data = request.json 

     if(data is None or not 'username' in data or not 'password' in data): 
      abort(400) 
     else: 
      count = User.query.filter(User.username == data['username']).count() 
      if(count == 0): 
       abort(404) #that user doesnt exist 
      else: 
       passIsCorrect = User.query.filter(User.username == data['username'], 
                User.password == data['password']).count() 
       if(passIsCorrect): 
        session['user'] = data['username'] 
        return redirect(url_for('index')) 
       else: 
        abort(401) 

    else: 
     return render_template('login.html') 

그러나 클라이언트 측 브라우저 리디렉션하지 않고 내가 완성 기능에서 응답 객체에서 보면 나는 보통에서 반환 될 것을보고 내 '/'경로 : 200 OK 및 index.html 템플릿.

내 질문은 : 나는 클라이언트 리디렉션하게 가로 챌 수있는 몇 가지 방법은

있습니까?

jquery가 브라우저가 아닌 요청을 시작하기 때문에 문제가 있다고 가정합니다.

이 문제를 해결하기위한 첫 번째 시도는 make_response을 사용하여 직접 응답을 구성하고 Location 헤더를 설정하는 것이었지만 동일한 결과가 발생했습니다. 현재 솔루션은 200을 반환하고 클라이언트는 window.location = "/"을 처리하지만 이는 해킹 된 것처럼 보입니다.

+4

일반 양식의 동작을 복제하려면 왜 AJAX를 사용하고 있습니까? 또한 일반 텍스트 암호는 저장하지 마십시오. 해쉬. – Blender

+0

이 작업을 위해 [Flask-Login] (https://github.com/maxcountryman/flask-login)을보고 싶을 수도 있습니다. 아마도 대부분의 자체 구축 인증 시스템보다 더 안전 할 것입니다. –

+0

@Blender 결국 https를 넘을 것입니다. – bio595

답변

9

리디렉션이 작동하지 않습니다 : 당신의 JS와

return url_for('index') 

이를 처리 : 그래서 당신은 모든 확인 (상태 200) 대신에 실제 리디렉션 경우 리디렉션 링크를 반환 할 수 있습니다 그들을 존경하지 마십시오. 대부분의 사람들은 JSON 응답에서 리다이렉트 (redirect)하기 위해 코드 200과 URL을 리턴함으로써 자신 만의 리디렉션 솔루션을 구현합니다. 좋은 예를 보려면 this question을 참조하십시오.

부수적으로, ajax를 통해 로그인 양식을 게시해도 실제로 많은 이점을 얻지는 못합니다. 브라우저의 POST를 정상적으로 수행 한 다음 플라스크 뷰 기능이 성공하면 새 페이지로 리디렉션되거나 다시 리디렉션됩니다. 실패시 로그인 페이지로, 가능하면 flash 메시지를 사용하여 사용자에게 오류를 알립니다.

6

리디렉션 된 콘텐츠가 리디렉션 된 콘텐츠를 반환하지 않기 때문에 이유가 없습니다 (index 콘텐츠 만). 브라우저가 수행 아약스 호출에

var successFunction = function (data) { 
    // do something 
    window.location = data; 
}; 
관련 문제