从同一服务器调用RESTAPI

从同一服务器调用RESTAPI,rest,flask,python-requests,wtforms,flask-restful,Rest,Flask,Python Requests,Wtforms,Flask Restful,我有一个web应用程序,它由位于同一服务器上的RESTAPI支持。假设我有一个任务资源,可以在/api/Task/上访问,还有一个网页/create Task,它基本上只是一个创建任务的表单。有几种方法可以做到这一点: a) 使用Javascript与RESTAPI通信(不希望这样做) b) 直接在数据库中创建对象 @app.route('/create-task', methods=['POST']) def create_task(self): # create an object

我有一个web应用程序,它由位于同一服务器上的RESTAPI支持。假设我有一个
任务
资源,可以在
/api/Task/
上访问,还有一个网页
/create Task
,它基本上只是一个创建任务的表单。有几种方法可以做到这一点:

a) 使用Javascript与RESTAPI通信(不希望这样做)

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) 使用
请求
库调用RESTAPI

@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
来执行此操作?

如果可能,最好的做法是直接通过Python调用API代码,而不必通过HTTP和REST。这将避免HTTP请求的开销和可能的故障点。我不熟悉
flaskrestful
,所以我不知道这有多容易。“”中的答案似乎建议将通用代码从API中提取到一个库中,您可以在API和应用程序中使用该库,这也会起作用

除此之外:

A) 如果API不需要身份验证或不意味着“保密”,那么使用Javascript/AJAX可能不会太糟糕。您必须用Javascript编写表单错误处理,但是如果RESTAPI调用返回错误,您可以避免HTTP请求/create任务

C) 比B)好,因为东西破裂的可能性更小。只有RESTAPI负责创建任务,您所做的只是传递参数。问题是您需要从API中读取任何错误响应,然后在表单处理程序中重新编写它们,这是一项愚蠢的工作。此外,这还造成了脆弱性,无法在('api.task')的
URL\u中生成正确的URL,无法在生产服务器上访问该URL,等等

B) 与复制粘贴代码错误的原因相同。现在有两个地方可以创建任务,如果更改了某些内容(例如数据库实现细节),则必须记住修改这两个地方。这将最终打破,回来伤害你