【问题标题】:Can I use Flask and flask-restul to return JSON to API calls but HTML to browsers?我可以使用 Flask 和 flask-restul 将 JSON 返回到 API 调用但将 HTML 返回到浏览器吗?
【发布时间】:2017-01-28 21:19:46
【问题描述】:

我正在为个人项目构建一个 web 应用程序,我希望能够将 JSON 提供给 api 调用并将 HTML 提供给网站。

我的代码与此非常相似:

class TestAPI(Resource):
    def get(self):
        return {'hello': 'world'}
    def post(self):
        data = request.form["data"]            
        result = do_something(data)
        return {'result': result}

@mod.route("/")
def test():
    return render_template("test.html")

@mod.route("/do_something", methods=['GET','POST'])
def analyzer():
    form = TestForm()
    if request.method == 'POST':
        data = request.form.get("data")
        result = do_something(data)
        return render_template("result.html", result=result)
    return render_template("do_something.html", form=form)

我希望这能让用户导航到页面并以表单形式提交数据,对数据进行操作,然后在另一个 html 页面中返回(使用 jinja 模板)。我希望它也能让用户卷曲端点来做同样的事情,除了只是获取 JSON 值。

似乎发生的事情取决于我定义事物的顺序:

from app.views.test import test

api.add_resource(TestAPI, '/do_something')

当它像这样设置时,我从所有东西(在浏览器中,甚至从 curl 中)获取 HTML。如果我反转它,我到处都会得到 JSON。有没有办法让我两者兼得? (浏览器中的 HTML,否则为 JSON)

【问题讨论】:

    标签: python flask flask-restful


    【解决方案1】:

    我会说在您的后端,检查请求标头中的'User-Agent'参数。如果是浏览器,则返回 html 模板。如果是API,返回json。

    编辑

    感谢Piotr Dawidiuk

    上述解决方案并不是最优雅的方法。 accept属性更适合判断json还是html。

    Accept request-header 字段可用于指定某些媒体 响应可接受的类型。接受标头可以是 用于表示请求被特别限制为一个小的 一组所需的类型,如对内联请求的情况 图片。

    【讨论】:

    • 您好,感谢您的回复!如何检查烧瓶中的用户代理?它会作为 http 请求的标头出现吗?
    • 哦,我看到你编辑了!听起来像是一个标题。您是否建议根本不使用flask-restful,而只是确定在每个烧瓶路线中返回哪个?
    • @lnbl 我对烧瓶不是特别熟悉,但我只会检查每个烧瓶路由中的标题并相应地编码逻辑
    • @lnbl 也,仅供参考,您可以打开 chrome 检查并单击网络以查看 chrome 用户代理,如果您想了解有关它是哪个浏览器的信息,同样的规则适用于任何浏览器
    • @Bobby 兄弟你好,应该用Accept header 来控制,这就是这个 header 存在的原因。用User-agent 控制它并不干净,听起来像是一种解决方法,请编辑你的答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多