我目前使用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
添加到我的网址,在我的视图中对其进行测试,然后返回相应的答案,这是一个好习惯吗?
答案 0 :(得分:4)
实际上没有正确或错误的方法,对于Flask来说更是如此,这是一个对开发人员施加如此少的规则的框架。
如果您需要我的意见,我认为对网站和API使用相同的一组视图函数会导致难以维护的代码,因为两者之间存在一些显着差异,例如:
DELETE
请求。在Web浏览器上运行的Web应用程序需要执行GET
和POST
个请求。此外,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)