1. 動態路由的匹配器?
不知道這種叫啥名,啥用法,暫且叫做匹配器吧。
Flask自帶的匹配器可以說有四種吧(保守數字,就我學到的)
- 動態路由本身,可以傳任何參數字符串或者數字,如:<username>
- 只能傳整形數字,如:<int:user_id>
- 只能傳浮點型數字,如:<float:num>
- 只能傳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>
運行,結果如下
已經打到我們想要的效果@@