Я использую Flask WTForms для отправки формы, содержащей информацию о новом школьном предмете. Запрос POST выполняется, но он не захватывает информацию из полей формы.
Я получаю это сообщение в своем терминале:
ERROR: (psycopg2.errors.NotNullViolation) null value in column "grade" violates not-null constraint
DETAIL: Failing row contains (15, , null).
[SQL: INSERT INTO subjects (name, grade) VALUES (%(name)s, %(grade)s) RETURNING subjects.id]
[parameters: {'name': '', 'grade': None}]
(Background on this error at: http://sqlalche.me/e/gkpj)
127.0.0.1 - - [28/May/2020 11:57:29] "POST /api/subjects/create HTTP/1.1" 422 -
Мои запросы CURL также возвращают пустые поля данных. Было бы лучше присоединиться к конечным точкам запросов GET и POST для создания новой темы? Я разделил запрос POST на отдельную конечную точку, обрабатывающую запросы для использования API, а GET - для внешнего интерфейса.
app.py
@app.route('/api/subjects/create', methods=['POST'])
# @requires_auth('post:subjects')
def create_subject_api():
'''
Handles API POST requests for creating new subject. Returns JSON.
'''
body = request.get_json()
form = SubjectForm(request.form)
name = form.name.data
grade = form.grade.data
subject = Subject(
name=name, grade=grade
)
try:
subject.insert()
redirect(create_subject_api)
except Exception as e:
print('ERROR: ', str(e))
abort(422)
flash(f'{subject.grade}:{subject.name} successfully created!')
return jsonify({
'success': True,
'subject': subject.format()
})
forms.py
class SubjectForm(FlaskForm):
name = StringField(
'Name', [DataRequired()]
)
grade = SelectField(
'Grade', [DataRequired()],
coerce=int, choices=[
('7', '7'),
('8', '8'),
('9', '9'),
('10', '10'),
('11', '11'),
('12', '12')
])
new_subject. html
{% extends "base.html" %}
{% block content %}
<div class="container">
<h1>New Subject</h1>
<form action="/" method="post">
<h3 class="form-heading">List a new subject</h3>
<div class="form-field">
<label for="name">Name</label>
{{ form.name.label }} {{ form.name(size=20) }}
</div>
<div class="form-field">
<label for="grade">Grade</label>
{{ form.grade.label }} {{ form.grade }}
</div>
<button type="button" value="Create Subject" class="btn btn-primary btn-lg btn-block" onclick="submitSubject()">
Submit</button>
</form>
</div>
<script>
function submitSubject() {
let name = document.getElementById("name");
let grade = document.getElementById("grade");
let data = {
"name": name,
"grade": grade
}
fetch(`${window.location.origin}/api/subjects/create`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
})
.then((response) => {
return response.json();
})
.then((myJson) => {
if (myJson['success'] == true) {
window.location.href = '/subjects';
}
});
}
</script>
{% endblock %}