Flask筆記:URL(傳參,請求,重定向)


URL傳參:

  • 良好的URL:視圖函數對應的url以/結尾是一種良好url,因為用戶在訪問的時候無論他有沒有加上最后這個斜杠,都是能訪問到的,相反,視圖函數的url沒有以/結尾,用戶訪問的時候卻加上了這個/,那么用戶是訪問不到這個網頁的。
  • 使用path形式傳參:使用尖括號,如“<value>”將參數“value”通過URL傳入視圖函數,在視圖函數中也需要有同名的參數。如果URL中有多個參數,則視圖函數中也需要按順序定義相同的參數。這樣可以使用相同URL,但是因為參數不同而加載的數據卻不同。如圖:
  • path傳參中指定URL參數類型:在“<>”中使用形如“/args/<int:value>”來指定參數類型(此處指定的是int類型),注意冒號后面不能有空格,必須緊跟參數名。參數的常用數據類型有:
    • string:默認的類型,可以是任何不包含“/”和“\”的文本。
    • int:整型。
    • float:浮點類型。
    • path:和string類似,區別在於path類型可以包含“/”,即path類型為一個路徑表示文本。
    • uuid:uuid字符串。
    • any:url的同一個位置可以是多個值。例如下圖中“/user/111”和“/author/222”兩個不同URL都將使用同一個視圖函數:
  • 自定義url參數類型:自定義的類型需要繼承類BaseConverter,即from werkzeug.routing import BaseConverter,並且需要把這個類注冊到app.url_map.converters中才會生效。有兩種方式:
    • 第一種:在子類中重新定義變量regex,根據自身需要寫正則表達式,這個正則表達式就是參數需要滿足的條件和格式。
    • 第二種:在子類中重寫to_pythonto_url方法,這兩個方法的參數都只有一個,即value。to_python的value是url中傳入的字符串,它的返回值會作為對應視圖函數的參數值傳入;而to_url是用作函數url_for的返回值的,它的參數value是url_for函數傳入的參數值,參數的格式和類型則是to_python方法的返回值,to_url的返回值則會在填充到url字符串中對應參數的位置。
    •  1 from flask import Flask, url_for
       2 from werkzeug.routing import BaseConverter
       3 
       4 app = Flask(__name__)
       5 
       6 
       7 class TelConverter(BaseConverter):
       8     """
       9     第一種方式:只重新定義變量regex的正則表達式
      10     例如:該參數必須為11位的數字
      11     """
      12     regex = r'\d{11}'
      13 
      14 
      15 class PlusConverter(BaseConverter):
      16     """
      17     第二種方式:重寫方法to_python和to_url,前者用於視圖函數的參數獲取,后者用於url_for的url字符串獲取
      18     例如:參數需要以+號來進行分割進行獲取
      19     """
      20 
      21     def to_python(self, value):
      22         """例如傳入的value為:python+27"""
      23         return value.split('+')
      24 
      25     def to_url(self, value):
      26         """例如傳入的value為:['python', '27']"""
      27         return '+'.join(value)
      28 
      29 
      30 # 將自定義的參數類型進行注冊,注冊后才能生效
      31 app.url_map.converters['tel'] = TelConverter
      32 app.url_map.converters['plus'] = PlusConverter
      33 
      34 
      35 @app.route('/')
      36 def hello_world():
      37     """
      38     這里的url_for函數返回的則是:/python+27/
      39     就是說返回的url字符串中的參數值是經過to_url方法處理后返回的
      40     """
      41     return url_for('get_plus', plus_args=['python', '27'])
      42 
      43 
      44 @app.route('/<tel:telephone>/')
      45 def get_telephone(telephone):
      46     """此處的參數則被要求必須是11位的數字"""
      47     return '你的手機號是:{}'.format(telephone)
      48 
      49 
      50 @app.route('/<plus:plus_args>/')
      51 def get_plus(plus_args):
      52     """
      53     如果訪問:http://127.0.0.1:5000/python+27/
      54     則plus_args的值為['python', '27']
      55     也就是說傳入的參數值是經過了to_python方法的處理返回的
      56     """
      57     return str(plus_args)
      58 
      59 
      60 if __name__ == '__main__':
      61     app.run(debug=True)

       

  • 使用查詢字符串的方式傳參:即在瀏覽器的URL中使用“?key=value”的形式傳遞參數(多個參數之間使用“&”連接即可),在后台則使用“from flask import request”,然后使用“request.args.get(key)”來獲取參數key的值value。

 


URL請求:需要導入request對象“from flask import request”,提交的請求的相關信息都在這個對象中了。

  • 在route中指定視圖函數的請求接收方式:指定參數如“methods=['GET', 'POST']”,methods參數的值是一個列表,在其中指定需要的請求方式即可,若沒有指定則默認是GET,如果接收到的是POST請求,但卻沒有指定,則會報錯。
  • get請求獲取參數值:使用查詢字符串的方式傳遞參數時,使用“request.args.get('param_name)')”即可。
  • post請求獲取參數值:使用form表單傳遞參數時,使用“request.form.get('param_name')”即可,這個“param_name”是HTML中form表單元素的name屬性的值,當然也需要在form中指定提交請求的方式為post“method="POST"”(特別注意在視圖函數的route中也要指明post請求方式)。
  • 獲取request請求方式:使用“request.method”即可,它的值為請求方式的全大寫,比如“POST”。

 


URL重定向:需要“from flask import redirect”,它的第一個參數是一個URL字符串,這個URL字符串推薦使用“url_for”來獲取,第二個參數可以指定HTTP狀態碼,默認是302(302表示暫時性重定向,301表示永久性重定向)。如圖:

 


免責聲明!

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



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