2017-10-25 5 views
-3

데이터를 python (플라스크 사용)으로 보내 ajax 호출을 통해 postgresql 테이블을 추가 데이터로 업데이트합니다. 내 로컬 컴퓨터에는 오류가 없습니다. 그러나 Heroku에 배포하면 다음과 같이 나타납니다. 'NoneType'개체에 'first_name'특성이 없습니다. 버튼을 몇 번 클릭하면 처리됩니다. 이 오류를 어떻게 해결합니까?AJAX 수신 후 NoneType Heroku에서 SQLAlchemy에 데이터를 전달할 때 로컬에서 문제가 없습니다.

나는 하나의 변수 만 포함하도록 코드를 단순화했습니다. 다음은 아약스 호출입니다.

$(document).ready(function() { 

    $('form').on('submit', function(event) { 
     var first_name = $('#first_name').val() 


     $.ajax({ 
      data : { 
       first_name : first_name, 

      }, 
      type : 'POST', 
      url : '/process' 
     }) 
     .done(function(data) { 
       window.location.href = "/page2" 
     }); 

     event.preventDefault(); 

    }); 

    }); 

여기는 SQLAlchemy를 사용하여 파이썬에서 업데이트하려고하는 것입니다.

@app.route('/process', methods=['POST']) 
def page2_process(): 
    global app_id 
    update = Data1.query.filter_by(id = app_id).first() 
    update.first_name = request.form.get('first_name') 
    db.session.commit() 
    return json.dumps({'success': True}), 200, {'ContentType':'application/json'} 

나는 시도했다 : request.form [ 'first_name'] 나는 여전히 같은 문제가있다.

도움을 주시면 감사하겠습니다.

요청한대로 로그 추가 : 로그의 첫 번째 행은 업데이트 개체가 비어 있지 않음을 나타내는 로그입니다. Data1의 개체 18이 있기 때문입니다.

<Data1 18> 
[2017-10-26 06:58:25,886] ERROR in app: Exception on /page2_process [POST] 
Traceback (most recent call last): 
    File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", 
line 1982, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", 
line 1614, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", 
line 1517, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
    File "/app/.heroku/python/lib/python3.6/site-packages/flask/_compat.py", 
line 33, in reraise 
    raise value 
    File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", 
line 1612, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", line 
1598, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
    File "/app/app.py", line 396, in page2_process 
    update.first_name = request.from.get('first_name') 
AttributeError: 'NoneType' object has no attribute 'first_name' 
+0

확인 'first_name' 속성에 접근하기 전에'request.get_data()'가 비어 있지 않습니다. – lalithkumar

+0

이 데이터는 내 지역에서는 비어 있지 않습니다. 그리고 heroku에서 여러 번 submit 버튼을 누르면 통과하지 않습니다. 그것이 비어 있다고 생각하십시오. 또한 request.get_data()가 의미하는 것이 확실하지 않습니다. request.form.get() 대신 사용할 수 있습니까? – Dave

+0

나는'update = Data1.query.filter_by (id = app_id) .first()'와 실제로'None'을 리턴하는지 검사 할 것입니다. 도움이 필요하면 예외 객체의 메시지가 아닌 * 전체 추적 *을 제공하십시오. wsgi_app 응답 self.full_dispatch_request =() "/app.py"라인 1614 –

답변

0

당신에게 Heroku에서 클라이언트 요청이 아약스 호출을 아래와 같이 변경 통제 할 수없는 경우 : 당신이 속성에 액세스 할 수 있습니다

$.ajax({ 
     url: '/process', 
     data: JSON.stringify({ 'first_name ':first_name}, null, '\t'), 
     type: "post", 
     contentType: 'application/json;charset=UTF-8', 
     success: function(data){ 
      window.location.href = "/page2" 
     } 
    }); 

그리고 파이썬에서 request.json

@app.route('/process', methods=['POST']) 
def page2_process(): 
if request.json: 
    global app_id 
    first_name = str(request.json['first_name']) 
    update = Data1.query.filter_by(id = app_id).first() 
    if update: 
     update.first_name = request.form.get('first_name') 
    else: 
     //insert 
    db.session.commit() 
return json.dumps({'success': True}), 200, 
        {'ContentType':'application/json'} 
+0

이 대답을 확인 했습니까? @Dave – lalithkumar

+0

방금 ​​TypeError가 발생했습니다 : 'NoneType'개체는 subscriptable이 아닙니다[email protected] – Dave

+0

업데이트 개체에 어떤 내용이 포함되어 있습니까? 비워두면 안됩니다. 업데이트 된 답변을 확인하십시오 @Dave – lalithkumar