У меня есть веб-форма, которая является просто легкой связью текстовых полей, записывающих данные через 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())
Совет, пожалуйста!
Почему у вас есть две фигурные скобки вокруг вызова ajax и функции beforeunload? –
HTML-страница генерируется вызовом CGI, для которого требуется двойная привязка, чтобы избежать их - отдельные фигурные скобки интерпретируются как подлежащие заполнению переменные. –
Вы говорите, что запрос зависает, что будет означать, что на сервере есть проблема. Тем не менее, вы публикуете только свой код на стороне клиента. – jsfan