web.input () не принимает данные формы

Итак, я пытаюсь создать простую регистрационную форму, чтобы пользователи могли вводить свои данные и отправлять их на обработку. У меня проблемы с получением данных формы. По способу настройки сайта у меня есть форма «/ register», которая затем отправляет запрос ajax на URL-адрес «/ postregister». Оттуда входит в класс, который получает данные из web.input (), а затем ссылается на данные для всего, что мне нужно. Или, по крайней мере, это намерение ...

Проблема, с которой я столкнулся, заключается в самом первом шаге: захват данных формы со страницы «/ register». Фактически ничего не передается.

Вот файл register.html

<div class="container">
    <h2>Register Account</h2>
    <br /><br />
    <form id="register-form">
        <div class="form-group label-static is-empty>
        <label for="username" class="control-label">Username</label>
        <input id="username" class="form-control" type="text" placeholder="Choose a username..."/>
    </div>
    <button type="submit" class="btn btn-info">Submit </button>
    </form>
</div>

Главный controller.py:

import web

urls = (
    '/', 'Home',
    '/register', 'Register',
    '/postregistration', 'PostRegistration'
)

render = web.template.render("Views/Templates", base="MainLayout")
app = web.application(urls, globals())

class Home:
    def GET(self):
        return render.Home()

class Register:
    def GET(self):
        return self.Register()

class PostRegistration:
    def POST(self):
        data = web.input()
        print "data:   " + str(data) # This line is for debugging
        return data.username

if __name__ == "__main__":
    app.run()

плюс js:

$(document).ready(function() {
    console.log("loaded");

    $(document).on("submit", "#register-form", function(e) {
        e.preventDefault();

        var form = $("#register-form").serialize();
        console.log(form); //This is just for debugging
    $.ajax({
        url: '/postregistration',
        type: 'POST',
        data: form,
        success: function(response){
        console.log(response);
        }
    });
    });
});

Когда я запускаю controller.py и перехожу к localhost: 8080 / register, мне предлагается заполнить форму. Успех! Теперь я ввожу информацию и нажимаю "Отправить". Проблема !! При проверке журнала консоли форма фактически не записывается. Возникает «AttributeError» с AttributeError: 'username'. И конечно же, controller.py напечатает:

data:   <storage {}>

Итак, я вижу, что web.input () не получает данных. Возвращаясь немного назад, в веб-консоли я вижу, что написано «загружено», затем, когда я нажимаю «Отправить», я вижу, что что-то (но на самом деле ничего) записывается в консоль. Опять же, все признаки указывают на то, что я не собираю данные формы. Есть идеи, где я ошибся?


person j3private    schedule 06.09.2017    source источник


Ответы (3)


похоже, что метод сериализации опускает все поля, потому что они не включают атрибут имени. если вы добавите его в записи реестра следующим образом:

<div class="form-group label-static is-empty">
        <label for="username" class="control-label">Username</label>
        <input id="username" class="form-control" type="text" name="username" placeholder="Choose a username" />
</div>

тогда будет заполнена переменная формы. это по-прежнему возвращает ошибку 500 при попытке доступа к полю со строкой data.username ....

источники: JavaScript - получение значений HTML-формы https://api.jquery.com/serialize/.

person FolksyBeer    schedule 09.09.2017
comment
Большое спасибо за этот пост. Это сработало. Думаю, в следующий раз я буду внимательнее искать ответ на свой вопрос. Спасибо!! - person j3private; 10.09.2017
comment
Удалось ли вам исправить ошибку 500 в строке data.username? Я все еще придерживаюсь этого - person FolksyBeer; 10.09.2017
comment
да. Добавив атрибут name = username в HTML-файл, он работал отлично. Теперь я могу взять введенные пользователем данные и отправить их в свою MongoDB. - person j3private; 13.09.2017

Я думаю, что ваш селектор jQuery здесь неправильный:

var form = $("register-form").serialize();

Должно быть

var form = $("#register-form").serialize();

Источник

Это может привести к тому, что для сериализации .serialize () не будет выбран ни один элемент.

person Frish    schedule 06.09.2017
comment
Изменение не подействовало. Я вижу из вашего Источника, где я ошибся, но это не помогло. - person j3private; 07.09.2017
comment
Я не так хорошо разбираюсь в Python, но может ли ваша проблема возникнуть из-за отступа return data.username в классе PostRegistration? Из того, что я знаю о Python, похоже, что вы вызываете return вне функции POST (self). - person Frish; 07.09.2017
comment
Спасибо за ответ. Отступ возвращаемых данных data.username на самом деле правильный. Это может выглядеть странно из-за приведенного выше оператора print, но я считаю, что проблема где-то далеко до последнего оператора return в основном контроллере python. - person j3private; 07.09.2017
comment
Я прошу прощения. Я не совсем понял указанную вами ошибку. Вы правы насчет ошибки отступа. Кроме того, он по-прежнему не работает должным образом. - person j3private; 09.09.2017

Ошибка отступа:

class PostRegistration:
    def POST(self):
        data = web.input()
    print "data:   " + str(data) # This line is for debugging
    return data.username

Должно быть:

class PostRegistration:
    def POST(self):
       data = web.input()
       print "data:   " + str(data) # This line is for debugging
       return data.username

На стороне jquery .serialize() будет игнорировать все входные данные, у которых нет атрибута name. Вот почему вы ничего не получаете по сети.

Решение - добавить name='username' к вашему вводу.

person pbuck    schedule 07.09.2017
comment
Ты прав. Вместо того, чтобы копировать и вставлять код, я набрал его, чтобы просмотреть каждую строку по отдельности. Исправление, которое вы внесли в мой синтаксис, не меняет того факта, что данные по-прежнему не собирают информацию из формы. - person j3private; 09.09.2017