2,flask URL進階

 

 

video5python

flask特色:flask

1,爲框架,簡介,高擴展性。瀏覽器

2,flask相關依賴(jinja2,werkzeug)設計優秀。app

3,開發高效,如SQL的ORM框架

 

 

video6 debug模式ide

我只推薦run->edit函數

 

video7  配置文件post

1,文件方式ui

若文件路勁不帶,可加silent讓它在找不到路徑時候也不報錯。url

2,常規方式

 

 

video8  URL中的兩種傳參

 

path能夠接受‘/’。

能夠接受多個‘/’的URL:

 

 

能夠接受UUID:

全宇宙都惟一的隨機數,能夠作主鍵。

 

any:能夠指定多種路徑

1 @app.route('/<any(blog,user):url_path>/<id>')
2 def detail(url_path,id):
3     if url_path == 'blog':
4         return 'Blog:%s' %id
5     else:
6         return 'User:%s' %id

做用:不一樣的URL對應相同的視圖函數就這麼作。

 

 

 

 

 video9 url_for

帶參數的list函數中的page代入url_for的過程。

若是多帶一個count呢?

則將以查詢字符串的形式出現,結果爲:

帶參數的視圖函數有個功能:

當你瀏覽一個網頁想要評論的時候發現本身沒登錄,等你登錄後又能回到你剛纔要評論的頁面,這種狀況下能夠實現經過url_for帶參數的視圖函數。

先用arg獲取那個url後綴參數,經過url_for返到評論頁面。

 

 

 

 video10 自定義url_for轉換器

轉換器中已經存在int,float,string,UUID,path,any。那麼咱們定義一個電話號碼的?

from werkzeug.routing import  BaseConverter

在BaseConverter中Ctrl+B查看源代碼:

發現一個父類:
class BaseConverter(object)
而any繼承了這個父類:
class AnyConverter(BaseConverter):
且最後有一個對應關係:
#: the default converter mapping for the map.
DEFAULT_CONVERTERS = {
    'default':          UnicodeConverter,
    'string':           UnicodeConverter,
    'any':              AnyConverter,
    'path':             PathConverter,
    'int':              IntegerConverter,
    'float':            FloatConverter,
    'uuid':             UUIDConverter,
}

也就是說咱們本身能夠定義一個:

class TelephoneConverter(BaseConverter):

電話轉換器去繼承父類,而後加入默認映射表中。

 1 from flask import Flask
 2 from werkzeug.routing import  BaseConverter
 3 
 4 app = Flask(__name__)
 5 
 6 #url中限定手機號碼的格式
 7 class TelephoneConverter(BaseConverter):
 8     regex = r'1[345678]\d{9}'
 9     num_convert = int
10 app.url_map.converters['tel'] = TelephoneConverter
11 
12 @app.route('/tel/<tel:my_tel>')
13 def gg(my_tel):
14     return '%s' %my_tel

第8行表示11位的電話號碼。

第10行表示添加到默認映射表中。

結果爲:

 

 

下面定義a+b形式的轉換器:

先看代碼:

 1 #現有需求須要訪問a、b兩個板塊的文章返回出來
 2 from werkzeug.routing import  BaseConverter
 3 class ListConverter(BaseConverter):
 4     def to_python(self, value):
 5         return 'hahaha'
 6 app.url_map.converters['list'] = ListConverter
 7 
 8 @app.route('/list/<list:bankuai>')
 9 def aabb(bankuai):
10     return '%s' %bankuai

再看結果:

咱們發現這個to_python函數中的value實際上接受了url中的a+b,可是這個函數中咱們的寫法是無論傳入什麼咱們都返回hahaha,因此頁面上返回了hahaha。也就是說url中的值會經由to_python傳給視圖函數。to_url相反。

若是咱們在to_python函數中寫上別的東西呢?豈不是能實現咱們想要的轉換器?

 1 #現有需求須要訪問a、b兩個板塊的文章返回出來
 2 from werkzeug.routing import  BaseConverter
 3 class ListConverter(BaseConverter):
 4     def to_python(self, value):
 5         return value.split('+')  6 app.url_map.converters['list'] = ListConverter
 7 
 8 @app.route('/list/<list:bankuai>')
 9 def aabb(bankuai):
10     return '%s' %bankuai

第5行是變化後的代碼,效果以下:

 

再講講to_url。

 1 from werkzeug.routing import  BaseConverter
 2 from flask import url_for  3 class ListConverter(BaseConverter):
 4     def to_python(self, value):
 5         return value.split('+')
 6     def to_url(self, value):
 7         print("value:",value)
 8         return "+".join(value)  9 app.url_map.converters['list'] = ListConverter
10 
11 @app.route('/list/<list:bankuai>')
12 def aabb(bankuai):
13     return '%s' %bankuai
14 
15 @app.route('/')
16 def hello_world():
17     print(url_for('aabb',bankuai=['d','c']))
18     return 'to_url'

17的bankuai進入到to_url中,傳進去的是['d','c'],因此第7行返回了這個值,而後return回「+」鏈接的dc,最終在url_for的時候就打印成了‘/list/d+c’

結果:

第一個值是7行的,第二個是17行的。

 

 總結下:

 

video11  url_for小細節

先看代碼塊

1 @app.route('/list/')
2 def hello_world():
3     return 'Hello World!'

再看效果:

咱們發現咱們在第1行list後帶了個「/」,而後在瀏覽器輸入時候帶不帶這個斜槓都能訪問到。

再看不帶斜槓的:

因此咱們選擇第一種,由於第二種方法中可能代碼中沒寫url寫了的時候會出故障。

 

 

 

get和post

 

 

 

video12 重定向詳解

 

 

video13 關於響應(Response)

 

 

 

video29 加載靜態文本

用url_for

 

 

video 30 模板繼承

super繼承了父模板中的文件。

相關文章
相關標籤/搜索