flask第十一篇——自定義url轉換器


首先和大家說一下flask的組成,flask其實是werkzeug(路由和http處理)+SQLAlchemy(數據庫)+Jinja2(模板)組成的,今天我們要看到的東西就是`werkzeug`里面的內容。

我們在代碼里導入from werkzeug.routing import BaseConverter,然后進入BaseConverter中看一下這個方法的源碼:

其中to_python方法的作用就是將你傳過去的參數轉換成對應類型的數據,比如你設置傳參是uuid類型數據,那么當你傳參以后,就會調用to_python方法,將參數轉換為對應的uuid類型。

此外,下面還有PathConverterUUIDConverter等,再往下,我們會看到,原來這里寫好了一個映射,每當我們在url中傳入指定類型的參數時,系統會自動的來尋找這里的映射:

那么我們現在想自定義url轉換器——我們希望傳入的是list類型的數據,那么我們就可以參照上面代碼里的形式,定義to_python和to_url方法,並添加到DEFAULT_CONVERTERS映射中去。現在我們假定獲取到的參數是[1, 2, 3],我們要把它以1+2+3的形式在url中,那么我們to_python方法的任務就是將url中的1+2+3中的 +去掉;我們知道python的split方法可以去掉 +,但是它返回的是一個list列表,而url中地址不可能出現列表,即你不可能看到過地址是127.0.0.1:500/[1,2,3]/這種形式,所以我們另一個任務就是將數組轉換成我們需要的`1+2+3`這種形式。注意,我們的url地址參數是在代碼里傳的就是flask.url_for('detail', params=[1, 2, 3]),就是說地址是在代碼里傳,

我們已經想好了頁面的地址:

# coding: utf-8

from flask import Flask
from werkzeug.routing import BaseConverter
import flask app = Flask(__name__)  # type: Flask
app.debug = True

# 根目錄
@app.route('/')
def hello_world():    return 'Hello World!'

class ListConverter(BaseConverter):    def to_python(self, values):        """        將url中的參數轉換為我們需要的數據類型        """        # split方法就是去掉加號並返回list類型數據        tmp = values.split('+')
       print 'tmp: %s' % tmp
       return tmp
   
   def to_url(self, values):        """        將[1,2,3]轉換成1+2+3        """        # 遍歷列表values中的數據,以+連接,最后tmp1的值即1+2+3
       # BaseConverter.to_url是對url進行編碼        tmp1 = '+'.join([BaseConverter.to_url(self, value) for value in values])
       print 'tmp1:%s' % tmp1
       return tmp1


# 將寫好的類注冊到DEFAULT_CONVERTERS
app.url_map.converters['list'] = ListConverter

@app.route('/detail/<list:params>/')
def detail(params):    print 'parmas:%s' % params
   return 'success for url'

with app.test_request_context():
   print 'detail函數的url是:%s' % flask.url_for('detail', params=[1, 2, 3])


if __name__ == '__main__':    app.run()

執行代碼以后刷新頁面可以看到:

  • 控制台

tmp1:1+2+3
detail函數的url是:/detail/1+2+3/
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
tmp1:1+2+3
detail函數的url是:/detail/1+2+3/
 * Debugger is active!
 * Debugger PIN: 176-123-878
127.0.0.1 - - [15/Mar/2018 00:21:23] "GET /detail/1+2+3/ HTTP/1.1" 200 -
tmp: [u'1', u'2', u'3']
params:[u'1', u'2', u'3']
tmp: [u'1', u'2', u'3']
127.0.0.1 - - [15/Mar/2018 00:23:28] "GET /detail/1+2+3/ HTTP/1.1" 200 -
params:[u'1', u'2', u'3']
  • 頁面

    地址:http://127.0.0.1:5000/detail/1+2+3/
    頁面顯示:success for url

這里有點不好理解,很難理解,大家看懂更好,看不懂就知道有這么回事就好,后面還會有這里的說明的。

 

請關注微信公眾號:自動化測試實戰 ,查看清晰排版及圖片


免責聲明!

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



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