17

我有一个由位于同一服务器上的 REST API 支持的 Web 应用程序。假设我有一个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库调用 REST API

@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它吗?

4

1 回答 1

12

如果可能,实际最好的做法是直接通过 Python 调用 API 代码,而不通过 HTTP 和 REST。这将避免 HTTP 请求的开销和可能的故障点。我不熟悉,flask-restful所以我不知道这有多容易。“调用flask restful API 资源方法”中的答案似乎建议只是将公共代码从API 提取到您可以在API 和您的应用程序中使用的库中,这也可以。

除此之外:

A) 如果 API 不需要身份验证或不意味着“秘密”,则使用 Javascript/AJAX 可能不会太糟糕。您必须在 Javascript 中编写表单错误处理,但如果 R​​EST API 调用返回错误,您可以避免对 /create-task 的 HTTP 请求。

C) 比 B) 好,因为发生故障的可能性较小。只有 REST API 负责创建任务,而您所做的只是传递参数。问题是您需要从 API 中读出任何错误响应并将它们重新写入表单处理程序,这是一项愚蠢的工作。这也造成了能够在 中生成正确的 URL url_for('api.task')、能够在生产服务器上访问该 URL 等方面的脆弱性。

B) 不好,原因与复制粘贴代码不好。您现在有两个创建任务的地方,如果更改某些内容(例如数据库实现细节),您必须记住修改这两个地方。这最终会破裂并回来伤害你。

于 2014-11-13T10:26:41.710 回答