【发布时间】:2020-05-28 10:10:19
【问题描述】:
我正在使用 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 %}
【问题讨论】:
标签: python flask jinja2 flask-sqlalchemy flask-wtforms