我有一个Web应用程序,它由位于同一服务器上的REST API支持。假设我在Task
上可以访问/api/task/<task_id>
资源,而网页/create-task
基本上只是创建任务的表单。有几种方法可以做到:
a)使用Javascript与REST API进行通信(不想这样做)
b)直接在数据库中创建对象
@app.route('/create-task', methods=['POST'])
def create_task(self):
# create an object
try:
task = Task(request.form)
except:
# handle errors and put them to form
pass
# save it into db
task.save()
c)使用requests
库
@app.route('/create-task', methods=['POST'])
def create_task(self):
# send request to REST API
r = requests.post(url_for('api.task', _external=True), json=request.form.data)
if r.status_code != 200:
# handle errors and put them to form
pass
您认为哪种选择是最佳做法?想一想与错误处理和表单相关的问题。
关于flask-restful
的奖金问题。假设我已经建立了一个使用flask-restful构建的工作API,并希望使用选项b)。我可以以某种方式使用TaskResource.post
来做到这一点吗?
答案 0 :(得分:7)
如果可能的话,最好的办法是直接通过Python调用API代码,而无需通过HTTP和REST。这将避免HTTP请求的开销和可能的故障点。我对[{1}}不熟悉,所以我不知道这可能有多容易。答案在&#34; Calling flask restful API resource methods&#34;似乎建议只需将API中的公共代码提取到可以在API和应用程序中使用的库,这也可以使用。
除此之外:
A)如果API不需要身份验证或者不是秘密&#34;那么使用Javascript / AJAX可能不会太糟糕。您必须在Javascript中编写表单错误处理,但如果REST API调用返回错误,您可以避免对/ create-task的HTTP请求。
C)比B)更好,因为破坏事物的可能性更小。只有REST API负责创建任务,而您所做的只是传递参数。问题是你需要从API中读出任何错误响应并在表单处理程序中重写它们,这是一项愚蠢的工作。此外,这会在flask-restful
中生成正确的URL,能够在生产服务器上访问该URL等等,从而产生脆弱性。
B)因为复制粘贴代码不好而导致错误。您现在有两个创建任务的位置,如果更改了某些内容(例如数据库实现详细信息),则必须记住修改它们。这最终会破裂并重新伤害你。