Python 使用FLASK将RESTAPI与web界面相结合的最佳实践
我目前使用flask、sqlalchemy和jinja2构建了一个web应用程序 为了获得合适的web界面,我构建了如下视图:Python 使用FLASK将RESTAPI与web界面相结合的最佳实践,python,api,rest,flask,Python,Api,Rest,Flask,我目前使用flask、sqlalchemy和jinja2构建了一个web应用程序 为了获得合适的web界面,我构建了如下视图: @app.route('/mydata/', methods=['GET']) @login_required def mydata_list(): # build data here... return render_template('mydata/index.html', data=data)) 现在,如果我需要构建一个RESTAPI,我应该以
@app.route('/mydata/', methods=['GET'])
@login_required
def mydata_list():
# build data here...
return render_template('mydata/index.html', data=data))
现在,如果我需要构建一个RESTAPI,我应该以
return jsonify(data)
那么,如何处理这个问题以避免代码重复呢?在我的url中添加一个
?api=True
,在我的视图中测试它,然后返回适当的答案,这是一种好的做法吗?如果您想使用相同的端点为模板和JSON数据提供服务,您可以使用测试这是否是一个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)
要做到这一点,确实没有正确或错误的方法,更不用说Flask了,它是一个对开发人员施加很少规则的框架 如果您想听听我的意见,我认为对web站点和API使用相同的视图函数集会导致代码更难维护,因为两者之间存在一些显著差异,例如:
@app.route('/numbers/')
def numbers():
data = [1, 2, 3]
if request.is_xhr:
return jsonify(data=data)
return render_template('numbers.html', data=data)
- 身份验证:对于web和API,这通常是以非常不同的方式完成的
- 内容:对于API,您只返回数据,但是对于网页,view函数可能需要做更多的工作,并获取仅用于呈现模板的额外数据
- 请求方法:API使用的HTTP请求方法比web应用程序多。例如,要通过API删除资源,客户端通常会发送
请求。在web浏览器上运行的web应用程序需要处理delete
和GET
请求。另外,POST
请求方法在API和web应用程序中有不同的用法POST
我建议您将API和web应用程序的视图函数都设置得非常精简,并将应用程序的业务逻辑放在两组视图函数都可以调用的公共类中。您是否考虑过使用API获取web界面的内容?让我们将HTML端称为“web站点”,将JSON端称为“API”(就我而言,仅仅返回JSON并不能使其成为“RESTAPI”)。没有“正确”的方法来区分这两者。有人会说,因为它们解决的是不同的问题,所以它们不会像您所想的那样交织在一起(HTML和JSON的
data
变量可能不同)。您可以使用内容协商、URL中的参数或其他URL。没有“正确的方法”来区分这些问题。