如何使用 Flask 同时提供 HTML 和 JSON 内容?
How do I serve both HTML and JSON content with Flask?
我想设置一个具有 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 用户列表,可能采用 table 或其他一些不错的 GUI 格式。
但我也想为 API 请求提供 JSON 内容:
@app.route('/api/list')
def api_group_list():
groups_list = get_groups()
return jsonify({'groups': group_list})
这可行 - 但这是个好主意吗?我有两个问题:
1) 当我有两种不同类型的内容时,这是使用 Flask 的合适方式吗?为网络浏览器制作一个 /endpoint
URL (HTML),并制作一个相同的 /api/endpoint
URL 来处理 API 请求 (JSON )?
2) 或者我应该将这两个端点组合成一个函数吗?这似乎更简洁,但您如何确定用户访问了哪个端点?也就是下面的伪代码可以做吗?
@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})
回答你的第二个问题:
from flask import request
@app.route('/')
@app.route('/json')
def index():
if request.path == '/json':
return {}
return render_template('index.html')
文档参考是 here。
您还可以按方法将请求拆分为不同的函数,如下所示:
@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
└──.....
我想设置一个具有 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 用户列表,可能采用 table 或其他一些不错的 GUI 格式。
但我也想为 API 请求提供 JSON 内容:
@app.route('/api/list')
def api_group_list():
groups_list = get_groups()
return jsonify({'groups': group_list})
这可行 - 但这是个好主意吗?我有两个问题:
1) 当我有两种不同类型的内容时,这是使用 Flask 的合适方式吗?为网络浏览器制作一个 /endpoint
URL (HTML),并制作一个相同的 /api/endpoint
URL 来处理 API 请求 (JSON )?
2) 或者我应该将这两个端点组合成一个函数吗?这似乎更简洁,但您如何确定用户访问了哪个端点?也就是下面的伪代码可以做吗?
@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})
回答你的第二个问题:
from flask import request
@app.route('/')
@app.route('/json')
def index():
if request.path == '/json':
return {}
return render_template('index.html')
文档参考是 here。
您还可以按方法将请求拆分为不同的函数,如下所示:
@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
└──.....