2016-02-23 2 views
0

У меня есть веб-форма, которая является просто легкой связью текстовых полей, записывающих данные через CGI в базу данных SQL. Это прекрасно работает.Ajax POST висит

Моя проблема заключается в том, что, в дополнение к <input type='submit'/>, что я должен представить форму я хочу это представляется, если пользователь переходит от страницы - для этого у меня есть следующие JQuery:

<script> 
     $(window).on('beforeunload', function(){{ 
      $.ajax({{ 
       type:'POST', 
       url:'../save_teacher_actions_no_redirect.py', 
       data:'group={group}&AP={AP}&year=14/15&' + $('#ta_form').serialize(), 
       success:function(){{}} 
       }}); 
     }}); 
    </script>  

В инструментах Chrome dev, например, я вижу, что POST для «save_teacher_actions_no_redirect.py» происходит, как и GET на странице, которую я запрашиваю, чтобы гарантировать, что это событие запускается при навигации, однако ни один запрос не завершается, и страница только что висит со статусом в инструментах dev как (pending)

.................................................................................................................... будет висеть.

#!C:\Python34\python.exe 
import datetime 
import pymssql 
import cgi 
import os 
from connection_data import NationalAverages 
myDB = NationalAverages() 
from pm_authenticate import authenticate_user_against_group 

#logging 
import logging 
logger = logging.getLogger(__name__) 
logger.setLevel(logging.DEBUG) 
handler=logging.FileHandler('error_log.log') 
logger.addHandler(handler) 

# Connection details for the database  
cursor = myDB.connect_to_db() 
conn = myDB.conn 

form = cgi.FieldStorage() 

def right(string): 
    return string[len(string)-1] 

def default_value(value): 
    if value is None: 
     return ' ' 
    else: 
     return value 

def left(string): 
    return string[0:3] 

def save_data(form): 
    group = form.getfirst("group", "7bg/IL4") 
    AP = form.getfirst("AP", "AP2") 
    academic_year = form.getfirst("year", "14/15") 
    list_of_ids = [] 

    # get ids of the rows on page 
    for key in form.keys(): 
     if ((left(key) == 'ta_' or left(key) == 'da_') and right(key).isnumeric()): 
      if int(right(key)) in list_of_ids: 
       continue 
      else: 
       list_of_ids.append(int(right(key))) 
     else: 
      continue 

    cursor.execute('SELECT DISTINCT ID FROM Teacher_Actions WHERE Academic_Year = %s AND group_code = %s AND AP = %s', (academic_year, group, AP)) 
    existing_ids = cursor.fetchall() 

    for id in existing_ids: 
     if id in list_of_ids: 
      continue 
     else: 
      cursor.execute('DELETE FROM Teacher_Actions WHERE ID = %d AND Academic_Year = %s AND group_code = %s AND AP = %s', (id, academic_year, group, AP)) 
      conn.commit() 


    for id in list_of_ids:  

     cursor.execute('SELECT * FROM Teacher_Actions WHERE ID = %d AND Academic_Year = %s AND AP= %s AND group_code =%s', (id, academic_year, AP, group)) 
     existing_data = cursor.fetchone() 
     if not existing_data: 
      cursor.execute('INSERT INTO Teacher_Actions VALUES (%d, %s, %s, %s, %s, %s, %s, %s)', (id, academic_year, group, AP, form.getvalue('ta_students_' + str(id)), form.getvalue('ta_gaps_' + str(id)), form.getvalue('ta_action_when_' + str(id)), form.getvalue('ta_success_point_' + str(id)))) 
      conn.commit() 
     else: 
      cursor.execute('UPDATE Teacher_Actions SET Students = %s, Gaps = %s, Action_When = %s, Success_Point = %s WHERE ID = %d AND Academic_Year = %s AND Group_Code = %s AND AP = %s', (form.getvalue('ta_students_' + str(id)), form.getvalue('ta_gaps_' + str(id)), form.getvalue('ta_action_when_' + str(id)), form.getvalue('ta_success_point_' + str(id)), id, academic_year, group, AP)) 
      conn.commit() 

try: 
    save_data(form) 
except: 
    logger.exception(datetime.datetime.now()) 

Совет, пожалуйста!

+0

Почему у вас есть две фигурные скобки вокруг вызова ajax и функции beforeunload? –

+0

HTML-страница генерируется вызовом CGI, для которого требуется двойная привязка, чтобы избежать их - отдельные фигурные скобки интерпретируются как подлежащие заполнению переменные. –

+0

Вы говорите, что запрос зависает, что будет означать, что на сервере есть проблема. Тем не менее, вы публикуете только свой код на стороне клиента. – jsfan

ответ

0

У меня это работает. По сути, это потому, что файл, в который я был POSTING, был .py, а не .cgi ... моя неопытность светит еще раз.