How to correctly redirect/submit POST request from a form (wtforms) to a REST api (flask-restless)?
我找不到将数据从提交的表单重定向到REST API的正确方法。
目前 - 如下面的示例 - 在视图/路由中处理"POST"方法(请参阅路由"add_person()")。
我的示例数据模型(基于SQLAlchemy):
1 2 3 | class Person(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20)) |
通过html渲染的表单(基于wtforms):
1 2 | class PersonForm(FlaskForm): name = TextField("Person name", validators=[DataRequired()]) |
查看/路线声明:
1 2 3 4 5 6 7 8 9 10 | @views.route('add_person', methods=["GET","POST"]) def add_person(): form = PersonForm() if request.method == 'POST' and form.validate_on_submit(): person = Person() person.name = form.name.data db.session.add(person) db.session.commit() return redirect(url_for('view.add_person')) return render_template('person_add.html', form=form) |
HTML模板:
1 2 3 4 5 | <form method="POST" action="/add_person"> {{ form.csrf_token }} {{ form.name.label }} {{ form.name(size=20) }} <input type="submit" value="Submit"> </form> |
现在我想将数据库/ CRUD相关的操作委托给REST api。
为"Person"数据模型生成的API端点是:"/ api / person"。
如果我切换表单的"动作":
1 | "/add_person" |
至:
1 | "/api/person", |
然后我被重定向到API网址,所以我猜这不是一个正确的方法。
我想我仍然应该使用视图/路由处理并在那里进行POST api调用而不是持久化"Person"对象。 这是最干净的解决方案吗? 我怎么能接近这个?
我会自己回答这个问题。
我最后留下了在Flask中处理的form的"/ add_person"POST操作,然后使用Python"requests"库向API端点发出请求。