2017-01-28 84 views
2

我正在爲一個個人項目構建一個web應用程序,我希望能夠將JSON提供給api調用和HTML到網站。我可以使用Flask和flask-restul將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') 

當它的成立是這樣,我得到的一切HTML(在瀏覽器中,甚至從捲曲)。如果我將其反轉,我就會得到JSON。我有兩種方法可以獲得這兩種方式嗎? (在瀏覽器中使用HTML,否則使用JSON)

回答

3

我想在你的後端檢查請求標題中的'User-Agent'參數。如果它是一個瀏覽器,則返回html模板。如果它是一個API,則返回json。

編輯

感謝的Piotr Dawidiuk

上述解決方案是不是最優雅的方式來做到這一點。 accept屬性更適合確定json或html。

Accept request-header字段可用於指定響應可接受的某些媒體 類型。接受標頭可以是 ,用於指示該請求特別限於小型 一組所需類型,如在請求在線 圖像的情況下。

+0

嗨,謝謝你的迴應!如何在燒瓶中檢查用戶代理?它是否會以http請求的標題出現? – Inbl

+0

哦,我看到你編輯!聽起來像是一個標題。你會建議不要使用燒瓶 - 然後只是決定哪個返回在每個燒瓶路線? – Inbl

+0

@lnbl我不是特別熟悉燒瓶,但我只是檢查每個燒瓶路徑中的頭文件,並且也編寫邏輯 – Bobby

相關問題