Flask入門之自定義過濾器(匹配器)


1.  動態路由的匹配器?

  不知道這種叫啥名,啥用法,暫且叫做匹配器吧。

  Flask自帶的匹配器可以說有四種吧(保守數字,就我學到的)

  1. 動態路由本身,可以傳任何參數字符串或者數字,如:<username>
  2. 只能傳整形數字,如:<int:user_id>
  3. 只能傳浮點型數字,如:<float:num>
  4. 只能傳path路徑,如:<path:url>

  舉個例子  

 1 from flask import Flask
 2 
 3 app = Flask(__name__)
 4 
 5 @app.route('/user/<int:user_id>'
 6 def user(user_id):
 7     return 'Hello,%d' %user_id
 8 
 9 if __name__ == '__main__':
10     app.run(debug=True)

  這個user的路由只能響應整型的數字路徑,不能輸入字符串的

  

  當然上面的很簡單,接下來,我要定義一個使用更廣泛,功能更強大的

  正則匹配器  

 1 #coding:utf-8
 2 
 3 from flask import Flask
 4 from werkzeug.routing import BaseConverter
 5 
 6 #定義正則轉換器的類
 7 class RegexConverter(BaseConverter):
 8     def __init__(self,url_map,*items):
 9         super(RegexConverter, self).__init__(url_map)
10         self.regex=items[0]
11 
12 app = Flask(__name__)
13 #實例化
14 app.url_map.converters['regex']=RegexConverter
15 
16 @app.route('/user/<regex("([a-z]|[A-Z]){4}"):username>', methods=['POST', 'GET'])
17 def user(username):
18     return 'Hello,%s' % username
19 
20 if __name__ == '__main__':
21     app.run(debug=True)

 

   我們在轉化器中規定,只能是四個英文字符才能被這個路由匹配,多余或者少於都不行

  我們來看看效果,先輸入Bikmin,五個字符,Not Found

  

  再來輸入正確的字符數字:Ming

  

  現在已經成功@@

 

2.  HTML中的過濾器

  HTML中經常要使用各種轉換器

  最常見的就是safe了(這是自帶的)

  更多官方過濾器請查看: List of Builtin Filters

  我們先舉個safe的例子了解下這個過濾器是如何作用的

  #Sample.py

@app.route('/home')
def hone():
    return render_template('index.html',title='<h1>Hello,World!</h1>')

  #index.html

<body>
    {{ title }}
</body>

 

  運行,輸出如圖

  

  這是為什么呢?因為Jinjia2處於安全考慮,沒有進行轉義

  這種情況下,我們就可以使用safe轉化器了(自帶的)

  將#index.html 改為

<body>
    {{ title|safe }}
</body>

  再次運行,輸出如圖

  

  附:上面這種情況除了過濾器起之外,還有另一種方法:塊

  #index.html

<body>
{% autoescape false %}
    {{ title }}
{% endautoescape %}
</body>

 

  同樣的,我們也許需要自定義我們自己的過濾器

  這里我們就自定義個,可以將markdown語法的文件進行轉義輸出到頁面的過濾器

  首先要先安裝markdown這個庫

pip install markdown

  #Sample.py

 1 # coding:utf-8
 2 
 3 from flask import Flask,render_template
 4 
 5 app = Flask(__name__)
 6 
 7 @app.route('/home')
 8 def hone():
 9     return render_template('index.html',title='## header 2')
10 
11 # 這里定義一個過濾器,取名為'md'
12 @app.template_filter('md')
13 def md_to_html(txt):
14     from markdown import  markdown
15     return markdown(txt)
16 
17 
18 if __name__ == '__main__':
19     app.run(debug=True)

 

  現在我們就可以使用md這個過濾器了

  #index.html

<body>
    {{ title|md }}
</body>

  運行,查看結果

  

  這時我們發現,markdown語法(##)已經轉換成html格式的<h2>標簽,說明起作用了

  當然我們還需要用前面講過的safe進行 轉義

  #index.html

<body>
    {{ title|md|safe }}
</body>

  

  至此,我們已經學會了如何自定義一個過濾器了

-------------------------------------------------以下內容,擴展,選擇性學習-------------------------------------------------

 

  在日常工作中,我們不能只對變量進行md轉換吧?

  我們可能會從一個文本中進行讀取,然后渲染到html頁面中

  這時我們就要定義一個函數,讀取文本內容到內存中,賦值給變量,在對其進行md轉換。

  首先我們要寫一個markdown格式的文件,注意不要用notepad來寫,讀取的時候會有編碼錯誤,調都調不回來

建議使用Pycharm來新建一個http_methods.md的文件並寫入:

# 常見的HTTP方法

## GET
瀏覽器告知服務器:只獲取頁面的信息發給我
這是常用的方法

## POST
瀏覽器告知服務器:想在URL中發布新信息
並且,服務器必須確保數據已存儲且只存儲一次
這是HTML中發送表單數據到服務器的一種方法

  

  代碼如下:

  #Sample.py

 1 # coding:utf-8
 2 
 3 from flask import Flask,render_template
 4 
 5 app = Flask(__name__)
 6 
 7 @app.route('/home')
 8 def hone():
 9     return render_template('index.html',title='## header 2')
10 
11 @app.template_filter('md')
12 def md_to_html(txt):
13     from markdown import  markdown
14     return markdown(txt)
15 
16 def read_md_file(filename):
17     with open(filename) as md_file:
18         content = reduce(lambda x,y:x+y,md_file.readlines())
19     return content.decode('utf-8')
20 
21 # 注意:這里很重要,作用是把read_md_file()這個函數注冊到所有的Jinjia模板中
22 # 不然html中會找不到這個函數而出錯
23 @app.context_processor
24 def inject_methods():
25     return dict(read_md=read_md_file)
26 
27 # read_md是html使用的函數名,read_md_file是上面定義的函數名
28 
29 if __name__ == '__main__':
30     app.run(debug=True)

 

 

  #index.html

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     {{ read_md('http_methods.md')|md|safe }}
 9 </body>
10 </html>

  運行,結果如下

已經打到我們想要的效果@@

 

 


免責聲明!

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



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