从同一服务器调用REST API

时间:2014-11-11 15:28:41

标签: rest flask python-requests wtforms flask-restful

我有一个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

调用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来做到这一点吗?

1 个答案:

答案 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)因为复制粘贴代码不好而导致错误。您现在有两个创建任务的位置,如果更改了某些内容(例如数据库实现详细信息),则必须记住修改它们。这最终会破裂并重新伤害你。