从同一服务器调用REST API

Mar*_*old 11 rest flask wtforms python-requests 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()
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

您认为哪种选择是最佳做法?考虑与错误处理和表单相关的问题.

有关的奖金问题flask-restful.假设我已经建立了一个使用flask-restful构建的工作API,并希望使用选项b).我可以以某种方式使用TaskResource.post这样做吗?

Jar*_*ski 9

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

除此之外:

A)如果API不需要身份验证或不是"秘密",使用Javascript/AJAX可能不会太糟糕.您必须在Javascript中编写表单错误处理,但如果REST API调用返回错误,您可以避免对/ create-task的HTTP请求.

C)比B)好,因为破坏事物的可能性较小.只有REST API负责创建任务,而您所做的只是传递参数.问题是你需要从API中读出任何错误响应并在表单处理程序中重写它们,这是一项愚蠢的工作.此外,这会在生成适当的URL url_for('api.task'),能够访问生产服务器上的URL等方面造成脆弱性.

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