2016-06-04 8 views
0

Ich arbeite an einer Web-App, die auf Kolben, PostgreSQL gebaut wird. Es wird verwendet, um Labordaten zu sammeln und die gesammelten Daten zu verwalten. Es gibt zwei Seiten in dieser App, die ich verwendet habe, um Labordaten einiger Labors anzuzeigen, die vom Benutzer durch Abfragen aus einer Datenbank ausgewählt wurden.

Eine Seite (admin_select_lab_for_data.html) ermöglicht es dem Benutzer einige bestehende Labors zu wählen und leitet den Benutzer auf der anderen Seite (admin_edit_data.html), die alle Daten in den ausgewählten Labors zeigt. Wenn ich die Labs auswähle und auf die Schaltfläche gehe, gehe zu lab, kann der Browser nicht zu (admin_edit_data) umleiten.

Die von python gedruckten Ausgaben sind alle korrekt (was beweist, dass in flask die Umleitung erfolgt, lab_ids korrekt übergeben und alle zugehörigen Daten korrekt abgefragt werden). Die HTTP-Anfrage gibt 200 OK zurück. Allerdings bleibt der Browser nur auf der gleichen Seite und Ajax-POST-Anfrage Benachrichtigung die Fehler (die mit der Tatsache unvereinbar ist, dass die Daten bereits durch admin_select_lab_for_data empfangen).Flask: nicht auf eine URL umleiten()

main.py

# review/edit Data 
@app.route('/admin_select_lab_for_data',methods=['GET','POST']) 
def admin_select_lab_for_data(): 
    if request.method=='POST': 
     lab_ids = [] 
     jsonData = request.get_json() 
     lab_ids = jsonData['lab_ids']   
     return redirect(url_for('admin_edit_data',lab_ids={'lab_ids':lab_ids})) 
    lab_list = [] 
    db_session = db.get_session() 
    for lab in db_session.query(schema.Lab_info).all(): 
     data_num = 0 
     query_rows = db_session.query(schema.Lab_rows).filter(schema.Lab_rows.lab_id==lab.lab_id) 
     for r in query_rows: 
      data_num += db_session.query(schema.Lab_data).filter(schema.Lab_data.row_id==r.row_id).count() 
     lab_list.append({'lab_id':lab.lab_id,'lab_name':lab.lab_name,'class_name':lab.class_name,'prof_name':lab.prof_name,'data_num':data_num}) 
    return render_template('admin_select_lab_for_data.html',lab_list=lab_list) 


# review/edit Data 
@app.route('/admin_edit_data') 
def admin_edit_data(): 
    # Get a list of lab_ids that are needed to be retrieved 
    lab_ids = ast.literal_eval(request.args['lab_ids'])['lab_ids'] 

    # lab_ids = ['test1_101_C','test2_101_N'] 
    lab_data = [] 
    lab_data_by_student = [] 
    row_names_list = [] 
    err_msg = '' 

    db_session = db.get_session() 

    #Group row data according to row_name 
    query_rows = db_session.query(schema.Lab_rows).filter(schema.Lab_rows.lab_id==lab_ids[0]).order_by(schema.Lab_rows.row_order) 
    for r in query_rows: 
     lab_data.append({'row_name':r.row_name,'row_data_list':[]}) 
     row_names_list.append(r.row_name) 


    for lab_id in lab_ids: 
     query_rows = db_session.query(schema.Lab_rows).filter(schema.Lab_rows.lab_id==lab_id).order_by(schema.Lab_rows.row_order) 
     index = 0 

     #Check whether these labs are compatitble with each other(the number of rows and the names of rows must be the same) 
     if query_rows.count()!=len(row_names_list): 
      err_msg = lab_ids[0]+' and '+lab_id+' are incompatible: the number of rows is different-'+str(query_rows.count())+' and '+str(len(row_names_list)) 
     else: 
      for r in query_rows: 
       if (row_names_list[index]!=r.row_name): 
        err_msg = lab_ids[0]+' and '+lab_id+' are incompatible:'+row_names_list[index]+' and '+r.row_name+' are different row names' 
        break 
       else: 
        query_datas = db_session.query(schema.Lab_data).filter(schema.Lab_data.row_id==r.row_id).order_by(schema.Lab_data.data_id) 
        for data in query_datas: 
         lab_data[index]['row_data_list'].append({'lab_id':lab_id,'student_name':data.student_name,'data_id':data.data_id,'row_data':data.row_data}) 

       index+=1 
     if err_msg!='': 
      return render_template('admin_edit_data.html',lab_data=lab_data,student_data=lab_data_by_student,lab_ids=lab_ids,err_msg=err_msg) 




    #Group row data according to student_name 
    for row in lab_data: 
     #sort row_data_list to make all the data across different lists 
     sorted(row['row_data_list'],key=lambda element:element['data_id']) 
     # if list is empty, add student names into it 
     if not lab_data_by_student: 
      for data in row['row_data_list']: 
       lab_data_by_student.append({'student_name':data['student_name'],'lab_id':data['lab_id'],'row_data_list':[]}) 

     for i in range(len(row['row_data_list'])): 
      data = row['row_data_list'][i] 
      lab_data_by_student[i]['row_data_list'].append({'row_name':row['row_name'],'row_data':data['row_data']}) 

    print('\n\n\n') 
    print(lab_ids) 
    print('\n\n\n') 
    print(lab_data) 
    print(lab_data_by_student) 
    print(lab_ids) 
    print(err_msg) 
    print('\n\n\n') 

    return render_template('admin_edit_data.html',lab_data=lab_data,student_data=lab_data_by_student,lab_id=lab_id,err_msg=err_msg) 

admin_select_lab_for_data.html

{% extends "admin_home.html" %} 
{% block head %} 
    <meta charset="UTF-8"> 
    <title>Select lab for data</title> 
    <script> 
     $(document).ready(function(){ 
      $('button[name=go_to_lab]').click(function(){ 
       var lab_ids = []; 
       var checkboxes = document.getElementsByTagName('input') 
       for (var i = 0; i < checkboxes.length; i++) { 
        if (checkboxes[i].type == 'checkbox' && checkboxes[i].checked) { 
         lab_ids.push($(checkboxes[i]).data('labid')); 
        } 
       } 
       if (lab_ids.length==0){ 
        $('#error_message_no_lab_choose').show().delay(1000).fadeOut(); 
       } 
       else{ 
        $.ajax({ 
          type: 'POST', 
          contentType: 'application/json', 
          dataType: 'json', 
          url: 'http://127.0.0.1:5000/admin_select_lab_for_data', 
          data: JSON.stringify({'lab_ids':lab_ids}), 
          success: function(result){ 
            alert('Submit successfully'); 
           }, 
          error : function(result){ 
            alert('Fail to submit'); 
            console.log(result) 
           } 
        }); 
       } 

      }); 
     }); 
    </script> 
{% endblock %} 

{% block content %} 

    {% if (lab_list|length)==0 %} 
     No lab exists<br> 
    {% else %} 
     <table class="table"> 
      <thead> 
       <tr> 
        <th class="tg-yw4l">Lab Index</th> 
        <th class="tg-yw4l">Lab Name</th> 
        <th class="tg-yw4l">Class Name</th> 
        <th class="tg-yw4l">Professor Name</th> 
        <th class="tg-yw4l">Number of data available</th> 
        <th class="tg-yw4l">Choose</th> 
       </tr> 
      </thead> 
      <tbody> 
      {% for lab in lab_list %} 
       <tr> 
        <th class="tg-yw4l">{{loop.index}}</th> 
        <td class="tg-yw4l">{{lab.lab_name}}</td> 
        <td class="tg-yw4l">{{lab.class_name}}</td> 
        <td class="tg-yw4l">{{lab.prof_name}}</td> 
        <td class="tg-yw4l">{{lab.data_num}}</td> 
        <td class="tg-yw4l"><input type="checkbox" data-labid="{{lab.lab_id}}"></td> 
       </tr> 
      {% endfor %} 
      </tbody>  
     </table> 
     <br> 
     <button name="go_to_lab">Go to lab</button> 
     <div class="temporary_message" id="error_message_no_lab_choose">You need to select one lab</div> 

{% endif %} 



{% endblock %} 

admin_edit_data.html

{% extends "admin_home.html" %} 
{% block head %} 
    <meta charset="UTF-8"> 
    <title>Edit Data</title> 

{% endblock %} 



{% block content %} 


{% if lab_data|length==0 %} 
<h1> No data available for this lab </h1> 
{% elif err_msg!="" %} 
<h1> {{err_msg}} <h1> 
{% else %} 
    <table class="table" id={{lab_id}} name={{lab_data|length}}> 
     <thead> 
      <tr> 
       <th>Index</th> 
       <th>Student Name</th> 
       <th>Lab ID</th> 
       {% for r in lab_data %} 
        <th>{{r["row_name"]}}</th> 
       {% endfor %} 
      </tr> 
     </thead> 
     <tbody> 
      {% for s in student_data %} 
       <tr> 
        <th>{{loop.index}}</th> 
        <td><input value={{s["student_name"]}}></td> 
        <td>{{s["lab_id"]}}</td> 
        {% for i in range(lab_data|length) %} 
         <td><input value={{s["row_data_list"][i]["row_data"]}}></td> 
        {% endfor %} 
        <td><button name=save_all>Save All</button></td> 
        <td><button name=delete>Delete</button></td> 
       </tr> 
      {% endfor %}   
     </tbody> 
    </table> 
    <button><a href="/admin_select_lab_for_data">Return</a></button> 

{% endif%} 

{% endblock %} 

Antwort

2

Sie nie eine Seite umleiten als Ergebnis einer Ajax-Post-Anforderung erreichen kann.

entweder Sie haben eine regelmäßige Form Post einreichen und die Umleitung zu tun, oder Sie benötigen ein Ergebnis aus dem Ajax-Aufruf zurückkehren und die Seite mit window.location im Browser ändern.