首页 文章

如何使用Flask提供HTML和JSON内容?

提问于
浏览
1

我想设置一个同时具有GUI和API组件的Flask应用程序 . 所以这是一个检索组列表的简单示例:

def get_groups():
    groups = db.session.query(SgmGroup.group_name).order_by(SgmGroup.group_name).all()
    return [group.group_name for group in groups]

@app.route('/list')
def group_list():
    groups_list = get_groups()
    return render_template('groups.html', groups=groups_list)

到目前为止一切都很好 - 这将为用户提供一个用户的HTML列表,可能是一个表或一些其他很好的GUI格式 .

但我也想为API请求提供JSON内容:

@app.route('/api/list')
def api_group_list():
    groups_list = get_groups()
    return jsonify({'groups': group_list})

这有效 - 但这是个好主意吗?我有两个问题:

1)当我有两种不同类型的内容时,这是使用Flask的合适方式吗?为Web浏览器(HTML)创建 /endpoint URL,并使用相同的 /api/endpoint URL来处理API请求(JSON)?

2)或者我应该将这两个 endpoints 合并为一个函数?这似乎更整洁,但是如何确定用户访问的 endpoints ?也就是说,下面的伪代码可以完成吗?

@app.route('/list')
@app.route('/api/list')
def group_list():
    groups_list = get_groups()

    if <user arrived here via the /list endpoint>:
        return render_template('groups.html', groups=groups_list)

    elif <user arrived here via the /api/list endpoint>:
        return jsonify({'groups': group_list})

2 回答

  • 1

    回答你的第二个问题:

    from flask import request
    
    @app.route('/')
    @app.route('/json')
    def index():
        if request.path == '/json':
            return {}
        return render_template('index.html')
    

    doc参考文献是here .

  • 0

    您还可以通过方法将请求拆分为不同的函数,如下所示:

    @app.route('/', methods=['GET', 'POST'])
    def index():
        if request.method == 'POST':
            return {}
        else:
            return render_template('index.html')
    

    出于项目结构的原因,我建议将路由拆分为api和不同文件中的模板 .

    project
    ├── app
    |    ├── views.py
    |    └── api.py
    └──.....
    

相关问题