Flask筆記:視圖函數/方法返回值(HTML模板/Response對象)


返回HTML模板:使用“from flask import render_template”,在函數中傳入相對於文件夾“templates”HTML模板路徑名稱字符串即可(默認模板路徑),flask會自動到項目根目錄的“templates”文件夾(創建flask項目時,PyCharm會自動創建兩個空文件夾,其中一個就是“templates”)下尋找對應的HTML文件。

  1. 默認模板路徑:項目根目錄下的templates文件夾。
  2. 自定義模板路徑:如果不想使用默認的模板路徑,即項目根目錄的templates文件夾,可以在實例化flask時指定參數template_folder的值,以指定默認模板的路徑。
  3. 模板傳參:如果需要給HTML模板傳參,則在“render_template”中使用變量名或字典進行傳參即可(在Python2中,如果涉及中文,需要使用Unicode字符串)。

  

 

返回Response對象:視圖函數返回響應Response給瀏覽器,一般來說只能是字符串和固定格式的元組,當然也可以自定義,但無論是返回哪種數據格式,最終都是被包裝成一個Response對象返回給瀏覽器的。返回的是字符串時,其實也是被包裝成Response對象返回給瀏覽器的。也可以是一個固定格式的元組:(Response, status, headers),即響應體、狀態碼和頭信息的元組,可以只返回一個Response,或者兩個(Response, status),或者全部返回(Response, status, headers)。當可以自定義返回的響應體時需要注意以下幾點:

  • Response子類:自定義的Response子類必須繼承自from flask import Response(其實就是from werkzeug.wrappers import Response)。
  • response_class:使用app.response_class=MyResponse使之生效。
  • force_type(response, environ=None):當返回的數據類型,既不是字符串,也不是元組時,flask就會調用Response的force_type方法來處理,如果不能處理就會返回錯誤,所以Response子類一般是需要重寫這個方法來返回一個合法的數據,參數response即為傳入的不合法的數據,可以經過處理后返回一個合法的Response對象。
  •  1 from flask import Flask, Response
     2 
     3 app = Flask(__name__)
     4 
     5 
     6 class MyResponse(Response):
     7     """自定義Response類"""
     8     @classmethod
     9     def force_type(cls, response, environ=None):
    10         """重寫force_type方法,當參數既不是字符串,
    11         也不是(Response, status, headers)元組時會調用此方法"""
    12         if isinstance(response, list):
    13             response = Response('+'.join(response))
    14 
    15         # 這里需要包裝成Response對象才能傳入父類的force_type中,
    16         # 只傳字符串會報錯
    17         return super().force_type(response, environ)
    18 
    19 
    20 # 指定自定義的Response類,使之生效
    21 app.response_class = MyResponse
    22 
    23 
    24 @app.route('/listresponse/')
    25 def list_response():
    26     # 返回一個不合法的數據
    27     # 如果沒有自定義的Response類來處理的話,就會報錯
    28     return ['python', '36']
    29 
    30 
    31 if __name__ == '__main__':
    32     app.run(debug=True)

     

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM