Flask-第二课:路由
無論是Django,還是Flask或者別的web框架的路由的目的都是建立url和函數的對應關系。
對于Flask,他的路由使用裝飾器來完成。
最簡單的路由
@app.route('/') def index():return 'Index Page'@app.route('/hello') def hello():return 'Hello World' basic_urlroute() 裝飾器把一個函數綁定到對應的 URL 上。
動態路由
我們經??吹筋愃苃ttp://www.cnblogs.com/yangshl/的url。這里的yangshl是我的博客園的用戶名。在Fask中也有帶變量的路由。
給 URL 增加變量的部分,把一些特定的字段標記作為參數傳入到函數中。當然也可以指定一個可選的轉換器通過規則 。
@app.route('/<path:username>/<pid>/hello') def hello_world(pid, username):print("pid", pid)print("username", username)return 'Hello World!' View Code若url是:http://127.0.0.1:8090/kelly/hi/28/hello
則我們截取到
pid 28
username kelly/hi
這說明函數中參數的順序可以和url中變量的順序不一致,他們是按照關鍵字來傳參的。而且路由的前后都可以固定的url部分。
其中:path是路由轉換器。
實際上Flask有如下幾個路由轉換器:
- 'default': <class 'werkzeug.routing.UnicodeConverter'>
- 'string': <class 'werkzeug.routing.UnicodeConverter'>
- 'any': <class 'werkzeug.routing.AnyConverter'>
- 'path': <class 'werkzeug.routing.PathConverter'>
- 'int': <class 'werkzeug.routing.IntegerConverter'>
- 'float': <class 'werkzeug.routing.FloatConverter'>
- 'uuid': <class 'werkzeug.routing.UUIDConverter'>
我們通過url傳遞的變量都是字符串,可以通過轉換器來來進行轉換類型和規定它匹配的格式。比如int,若我么傳入了abc,則不匹配,會報404錯誤。
自定義路由轉換器。
class RegexConverter(BaseConverter):def __init__(self, map, *args):self.map = mapself.regex = args[0]# 注冊轉換器
app.url_map.converters['regex'] = RegexConverter
@app.route('/view/<regex("[0-9\.,]+"):uuid>/')
def view(uuid):
return "view uuid: %s" % (uuid)
再進一步:self.regex到底是什么?
Flask(其實是Werkzeug)使用Converter把URL中特殊部分(<regex("[a-zA-Z0-9]+"):uuid>)轉換為Python變量,通用格式是<converter(args):var_name>。在這個例子中,一個叫regex的converter把URL中相應字段轉換為view()中的uuid變量。
因此,converter的regex就是用來判斷這串字符是否符合轉換格式,ok就轉換,否則跳過。對于IntegerConverter來說,"abc"顯然無能為力。也就是說,其實Werkzeug的路由本來就支持用正則表達式。string、int、float等都是從它派生出來的(可以看看IntegerConverter等built-in Converter的regex)。
至于為什么不顯式地支持,我猜可能是因為正則表達式不容易寫好,buggy。
反向路由
本質是根據函數名反向生成url,使用函數 url_for() 來針對一個特定的函數構建一個 URL。它能夠接受函數名作為第一參數,以及一些關鍵字參數, 每一個關鍵字參數對應于 URL 規則的變量部分。未知變量部分被插入到 URL 中作為查詢參數。
with app.test_request_context():
print(url_for('hello_world', username = 'kelly', pid = '12'))
則得到的url是:/kelly/12/hello
若url_for('hello_world', username = 'kelly', pid = '12', _external=True)則返回完整路徑:
http://localhost/kelly/12/hello
反向路由在Jinja2中也有使用,用于引入一些靜態文件。
?
總之:路由是url和處理函數之間的橋梁。
?
轉載于:https://www.cnblogs.com/yangshl/p/6408084.html
總結
以上是生活随笔為你收集整理的Flask-第二课:路由的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: postgresql成本因子调整
- 下一篇: 一个用于学习的react项目