Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用FLASK将RESTAPI与web界面相结合的最佳实践_Python_Api_Rest_Flask - Fatal编程技术网

Python 使用FLASK将RESTAPI与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,我应该以

我目前使用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,我应该以

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删除资源,客户端通常会发送
    delete
    请求。在web浏览器上运行的web应用程序需要处理
    GET
    POST
    请求。另外,
    POST
    请求方法在API和web应用程序中有不同的用法

我建议您将API和web应用程序的视图函数都设置得非常精简,并将应用程序的业务逻辑放在两组视图函数都可以调用的公共类中。

您是否考虑过使用API获取web界面的内容?让我们将HTML端称为“web站点”,将JSON端称为“API”(就我而言,仅仅返回JSON并不能使其成为“RESTAPI”)。没有“正确”的方法来区分这两者。有人会说,因为它们解决的是不同的问题,所以它们不会像您所想的那样交织在一起(HTML和JSON的
data
变量可能不同)。您可以使用内容协商、URL中的参数或其他URL。没有“正确的方法”来区分这些问题。