使用FLASK将REST API与Web界面相结合的最佳实践

时间:2013-12-27 09:59:47

标签: python api rest flask

我目前使用flask,sqlalchemy和jinja2构建一个Web应用程序。

为了获得正确的网络界面,我按如下方式构建我的视图:

@app.route('/mydata/', methods=['GET'])
@login_required
def mydata_list():
    # build data here...
    return render_template('mydata/index.html', data=data))

现在,如果我需要构建REST API,我应该以

结束
return jsonify(data)

那么,如何处理这个以避免代码重复?将?api=True添加到我的网址,在我的视图中对其进行测试,然后返回相应的答案,这是一个好习惯吗?

2 个答案:

答案 0 :(得分:4)

实际上没有正确或错误的方法,对于Flask来说更是如此,这是一个对开发人员施加如此少的规则的框架。

如果您需要我的意见,我认为对网站和API使用相同的一组视图函数会导致难以维护的代码,因为两者之间存在一些显着差异,例如:

  • 身份验证:这通常以非常不同的方式针对Web与API进行。
  • 内容:对于API,您只需返回数据,但对于网页,视图功能可能需要执行更多工作并获取仅用于呈现模板所需的额外数据。
  • 请求方法:API使用比Web应用程序更多的HTTP请求方法。例如,要通过API删除资源,客户端通常会发送DELETE请求。在Web浏览器上运行的Web应用程序需要执行GETPOST个请求。此外,POST请求方法在API与网络应用程序中有不同的用法。

我的建议是,使API和Web应用程序的查看功能非常薄,并将应用程序的业务逻辑放在两组视图函数都可以调用的公共类中。

答案 1 :(得分:1)

如果要使用相同的端点来提供模板以及JSON数据,可以使用request.is_xhr测试这是否是一个AJAX请求。例如:

@app.route('/numbers/')
def numbers():
    data = [1, 2, 3]

    if request.is_xhr:
        return jsonify(data=data)

    return render_template('numbers.html', data=data)