Форум программистов, компьютерный форум, киберфорум
Python: Web
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 12.05.2015
Сообщений: 132

Ajax response есть, а данных в базе нет

18.10.2017, 10:19. Показов 1271. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть форма обратной связи. заполняем 4 поля, отправляем и без перезагрузки страницы получаем в ответ надпись, что форма отправлена. Без ajax все работает. Ajax прикручиваю, запрос формируется, отправляется, получаю ответ обратно, но данные из формы не заносятся в базу. Т.е. ошибок явных нет, в базе ничего не появляется, надписи об успешном выполнении нет.

Думаю проблема в изъятии данных из POST или в записи в базу, хочу вашего мнения. Валидации и перехвата ошибок нет (да я плох, но пока так).

На скриншоте видно(консоль Firefox), что скрипт отрабатывает, данные уходят.

Модель:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
class zForm(models.Model):
    name = models.CharField(max_length=128, verbose_name="Имя", null=True, blank=True)
    email = models.CharField(verbose_name='email', max_length=256, null=True, blank=True)
    subject = models.CharField(max_length=128, verbose_name="Тема", null=True, blank=True)
    message = models.TextField(max_length=2056, verbose_name="Сообщение", null=True, blank=True)
    date = models.DateTimeField(default=timezone.now(), verbose_name="Дата сообщения", null=True, blank=True)
 
    def __str__(self):
        return self.name
 
    class Meta():
        db_table = "Форма связи"
        verbose_name = "Форма связи"
HTML:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<section id="six">
                                <div class="container">
                                    <h3>Контакты</h3>
                                    <p>Отправьте мне сообщения по форме ниже или свяжитесь со мной через социальные сети.</p>
{% if form_ok %}
 <div id="results"></div>
{% endif %}
                                    <form method="post" id="post-form">{% csrf_token %}
                                        <div class="row uniform">
                                            <div class="6u 12u(xsmall)"><input type="text" name="name" id="name" placeholder="Имя" required/></div>
                                            <div class="6u 12u(xsmall)"><input type="email" name="email" id="email" placeholder="Email" required/></div>
                                        </div>
                                        <div class="row uniform">
                                                <div class="12u">
                                                    <div class="select-wrapper">
                                                        <select name="subject" id="subject" style="font-style:Italic;color:#aaaaaa;" required aria-required="true">
                                                            <option value="">- Тема -</option>
                                                            <option value="Вопросы">Вопросы</option>
                                                            <option value="Сотрудничество">Сотрудничество</option>
                                                            <option value="Нашел ошибку">Нашел ошибку</option>
                                                            <option value="Люблю общаться">Люблю общаться</option>
                                                        </select>
                                                    </div>
                                                </div>
                                        </div>
                                        <div class="row uniform">
                                            <div class="12u"><textarea maxlength="2056" name="message" id="message" placeholder="Сообщение" rows="6" required aria-required="true"></textarea></div>
                                        </div>
                                        <div class="row uniform">
                                            <div class="12u">
                                                <ul class="actions">
                                                    <li><input type="submit" class="special" value="Отправить" /></li>
                                                    <li><input type="reset" value="Отчистить" /></li>
                                                    <li><input type="checkbox" id="demo-human" name="demo-human" required aria-required="true">
                                                    <label for="demo-human">Я человек, а не робот</label></li>
                                                </ul>
                                            </div>
 
                                        </div>
                                    </form>
                                </div>
                            </section>
Вьюха:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def create_post(request):
    if request.method == 'POST':
        name = request.POST.get('name', '')
        email = request.POST.get('email', '')
        subject = request.POST.get('subject', '')
        message = request.POST.get('message', '')
        response_data = {}
        a = zForm.objects.create(
            name=name,
            email=email,
            subject=subject,
            message=message
        )
        a.save()
        response_data['form_ok'] = 1
        response_data['result'] = "Сообщение отправлено!"
        response_data.update(csrf(request))
        return HttpResponse(
            json.dumps(response_data),
            content_type="application/json"
        )
    else:
        return HttpResponse(
            json.dumps({"nothing to see": "this isn`t happening"}),
            content_type="application/json"
        )
JS ajax(только рабочая часть):
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$(function() {
    $('#post-form').on('submit', function(event){
        event.preventDefault();
        console.log("form submited!")
        create_post();
    });
 
    function create_post() {
        console.log("create post is working!")
        var name = $('#name').val()
        var email = $('#email').val()
        var subject = $('#subject').val()
        var message = $('#message').val()
        $.ajax({
            url: 'create_post/',
            type: "POST",
            data: { 'name': name, 'email': email, 'subject': subject, 'message': message },
            success: function(json) {
                $('#name').val('')
                $('#email').val('')
                $('#subject').val('')
                $('#message').val('');
                $('#results').html("<b>"+json.result+"</b>");
                console.log("success");
            },
            error: function(xhr,errmsg,err) {
                $('#results').html("<div>oops! error: "+errmsg+"</div>");
                console.log(xhr.status + ": " +xhr.responseText);
            }
        });
    };
 
});
Миниатюры
Ajax response есть, а данных в базе нет  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.10.2017, 10:19
Ответы с готовыми решениями:

Определить есть ли такое значение в базе данных или нет
Здравствуйте делаю регистрацию и хочу проверить есть ли такой эмейл в базе. $rezul = mysql_query(&quot;SELECT * FROM users WHERE...

Вывод имен файлов которые есть в папке, но нет в базе данных!
Написал кнопку которая выводит количество файлов в папке, количество файлов в базе, и выводит имена тех файлов которые есть в папке но нет...

Нет подключения к базе данных MySQL(libmysqld.dll не так, которая в delphi Есть)
Здравствуйте! Достаточно все просто: 1). Скачал дистрибутив по MySql,который лежит в свободном доступе. Делал все просто по...

8
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,246
18.10.2017, 11:23
Лучший ответ Сообщение было отмечено XaxOo как решение

Решение

Кажется, вы тут накрутили с CSRF.
Если что не так понял, извините, пожалуйста.

Python
1
response_data.update(csrf(request))
Это что такое?

В общем, я думаю, варианты такие:

1) Берем форму, сериализуем данные вот так: https://api.jquery.com/serialize/
И кидаем аяксом на сервер. И смотрим, что csrf-токен сериализовался и полетел.

2) Вариант, предложенный в документации.
https://docs.djangoproject.com... ax-request

Ну, и, собственно, дебажим - смотрим запрос в браузере - что там токен полетел.
Ставим точку останова во вьюхе. Смотрим, что прилетело, есть ли токен.
1
0 / 0 / 0
Регистрация: 12.05.2015
Сообщений: 132
18.10.2017, 12:51  [ТС]
response_data.update(csrf(request)) - всегда так возвращал токен для сравнения, ну наверное это лишнее.
С JS ajax у меня еще дальше есть такое, насколько я понимаю - это и пихает в заголовок csrf и позволяет django его прочитать(с офф сайта)

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// This function gets cookie with a given name
    function getCookie(name) {
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
    var csrftoken = getCookie('csrftoken');
 
    /*
    The functions below will create a header with csrftoken
    */
 
    function csrfSafeMethod(method) {
        // these HTTP methods do not require CSRF protection
        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    }
    function sameOrigin(url) {
        // test that a given url is a same-origin URL
        // url could be relative or scheme relative or absolute
        var host = document.location.host; // host + port
        var protocol = document.location.protocol;
        var sr_origin = '//' + host;
        var origin = protocol + sr_origin;
        // Allow absolute or scheme relative URLs to same origin
        return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
            (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
            // or any other URL that isn't scheme relative or absolute i.e relative.
            !(/^(\/\/|http:|https:).*/.test(url));
    }
 
    $.ajaxSetup({
        beforeSend: function(xhr, settings) {
            if (!csrfSafeMethod(settings.type) && sameOrigin(settings.url)) {
                // Send the token to same-origin, relative URLs only.
                // Send the token only if the method warrants CSRF protection
                // Using the CSRFToken value acquired earlier
                xhr.setRequestHeader("X-CSRFToken", csrftoken);
            }
        }
    });
0
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,246
18.10.2017, 13:02
Киньте токен на сервер. Два способа я показал. Способ с сериализацией в вашем случае предпочтителен, мне кажется.
Причина: проще так. Вы же форму отобразили уже, там токен есть. Ну, теперь ее можно сериализовать. И токен полетит на сервер, как и все остальное.

В общем, дебажьте: смотрите сначала запрос на вкладке Network в браузере. Если токен не полетел, дальше можно не смотреть, т.к. проблема уже кое-как локализована. И она в том, что с клиента на сервер токен не полетел.
Если полетел, то дебажьте уже на сервере.
0
0 / 0 / 0
Регистрация: 12.05.2015
Сообщений: 132
18.10.2017, 13:05  [ТС]
вот токен полетел и прилетел, значит что-то во вьюхе? вы уверены, что проблема в csrf?
Миниатюры
Ajax response есть, а данных в базе нет  
0
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,246
18.10.2017, 13:15
Так это куки. Просто куки тут не показательны? Ну, сидят куки. И что? Надо запрос смотреть. Там все видно должно быть. Не только куки, но и содержимое формы.

Механизм работы токена таков: берется токен и насаживается в два места: в куку и в форму.
Содержимое формы отправляется на сервер. А кука летит на сервер автоматом.

Потом сравниваются эти два токена. Если совпало - ну, норм.
При этом главное - сравнить два токена, прилетевших из разных мест.

В доке написано, что возьмите токен из куки и киньте вместе с формой.
Защита действует потому, что прочитать куку может только JavaScript с того же домена.
«Злая страница» не сможет «переложить» куку в заголовок.

В хроме откройте вкладку Network. И смотрите там, что полетело.
0
0 / 0 / 0
Регистрация: 12.05.2015
Сообщений: 132
18.10.2017, 14:04  [ТС]
Я понимаю.Хром показывает, что только дата с формы ушла без токена, но ведь токен записывается в заголовок, разве нет? мое сообщение в 13-51 - дописал JS код , где это происходит. Т.е. получаем токен в куки и в заголовке
0
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,246
18.10.2017, 14:20
Покажите, пожалуйта, POST-запрос. Желательно, не скриншотом.

Добавлено через 3 минуты
Еще вариант: отключите мидлварь, ответственную за CSRF. Если все заработало, то проблема точно в токене.
0
0 / 0 / 0
Регистрация: 12.05.2015
Сообщений: 132
18.10.2017, 14:38  [ТС]
Я прошу прощение за такую шумиху =) Респонз возвращал мне не данные, а код страницы. Оказалось, что я совершенно не внимательный и ошибся в юрлах. Мой пример рабочий, но ошибка крылась в моей невнимательности) спасибо за внимание
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.10.2017, 14:38
Помогаю со студенческими работами здесь

Jquery-ajax и hibernate возвращает null хотя данные в базе есть
не выводятся данные из базы.думал это из-за скорости ajax запроса.т.е он выполняется быстрее чем сервер отреагирует и настроил c3p0.все...

Как подключиться к базе, которая и есть и нет
Есть программа с бд. Доступ клиентов осуществляется через программу которая подключается к базе на сетевом диске. Для работы с базой у...

Ajax response
Здравствуйте, есть форма, отправка с помощью ajax. На отправку формы стоят обработчики $.ajax({ url:...

Удаление файлов которых нет в базе, но есть в указанном каталоге
Шарю в папке файлы, смотрю есть ли с таким именем в базе, и если нет файла с таким именем в базе - то удаляю его!!! Проблема в том что...

Mvc c# database search js ajax. как реализовать поиск по базе данных
как реализовать поиск по базе данных mvc c# с использованием ajax, что почитать, куда копать, может примеры?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru