Table of Contents
01路由規則
通過url_map可以查看所有路由信息
if __name__ == '__main__': print(app.url_map) |
輸出結果:
Map([<Rule '/' (HEAD, OPTIONS, GET) -> index>, <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>]) |
Method限定訪問方式:
@app.route('/post_only', methods=['POST']) def post_only(): return "post_only page" |
輸出結果:
Map([<Rule '/post_only' (POST, OPTIONS) -> post_only>, <Rule '/' (HEAD, OPTIONS, GET) -> index>, <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>]) |
直接用瀏覽器打開這個url會405
同名路由:
@app.route('/test') def test1(): return "test1"
@app.route('/test') def test2(): return "test2" |
輸出結果:
Map([<Rule '/test' (HEAD, OPTIONS, GET) -> test1>, <Rule '/test' (HEAD, OPTIONS, GET) -> test2>, <Rule '/' (HEAD, OPTIONS, GET) -> index>, <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>]) |
直接在瀏覽器打開url,會看到test1,因爲在路由表查到的第一個就是他
如果一個method用post一個method用get,則能直接區分
一函數多路由:
@app.route('/test1') @app.route('/test2') def test(): return "test" |
輸出結果:
Map([<Rule '/test1' (HEAD, OPTIONS, GET) -> test>, <Rule '/test2' (HEAD, OPTIONS, GET) -> test>, <Rule '/' (HEAD, OPTIONS, GET) -> index>, <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>]) |
兩個url都可在瀏覽器訪問
重定向:redirect
url_for反 解析
From flask import redirect,url_for |
@app.route('/test1') def test(): url=url_for("index") #url='/' #return redirect(url) |
02路由提取參數與自定義路由轉換器
在django直接在路由中用正則表達式提取參數,flask中使用轉換器<>
轉換器默認有str,int,float,path,
@app.route('/goods/<int:goods_id>') def goods_detail(goods_id): return "goods %s detail page " % goods_id |
不加類型默認字符串(除了’/’)
@app.route('/goods/<goods_id>') def goods_detail(goods_id): return "goods %s detail page " % goods_id |
自定義規則:手機號規則
- 定義自己的轉換器,以類定義
- 繼承父類werkzeug.routing中的BaseCoverter
- 將自定義轉換器類添加到app
- 使用剛剛在converters中存放的字典key
from werkzeug.routing import BaseConverter class RegexConverter(BaseConverter): … |
app.url_map.converters["re"]=RegexConverter |
@app.route('/send/<re:mobile>') def send_sms(mobile): return "send sms to %s " % mobile |
通用轉換器:給re傳參
class RegexConverter(BaseConverter): """docstring for RegexConverter""" def __init__(self, url_map, regex): super(RegexConverter, self).__init__(url_map)#調用父類初始化 self.regex=regex#正則表達式參數 |
使用方式與django相似
@app.route('/send/<re(r'1[34578]\d{9}'):mobile>') |
也可定義非通用的特殊轉換器:init不傳參數,regex直接在init內部定義
繼承BaseConverter後也可對to_python和to_url覆寫
to_python和to_url返回url正則匹配後被提取的參數值
to_url在使用url_for的時候被調用
Request
可用於提取前端傳來的參數,最常用:data, form, args
Data從非表單請求體提取,form從表單轉換爲字典,args從url提取
拿一個:
name=request.form.get("name") |
拿重複值:
name_li=request.form.getlist("name") |
request.files獲取用戶上傳的文件,拿取文件時使用的名字是表單名
@app.route('/upload', methods=["POST"]) def upload(): file_obj=request.files.get("pic") if file_obj is None: return "未上傳文件" #保存文件 f=open("./demo.jpg","wb") f.write(file_obj.read()) f.close() return "上傳成功" |
flask爲文件對象封裝了save方法
@app.route('/upload', methods=["POST"]) def upload(): file_obj=request.files.get("pic") if file_obj is None: return "未上傳文件" #保存文件 file_obj.save("./demo.png") return "上傳成功" |
With使用:只用open時每次打開文件後需要close,有可能寫文件時出現異常,還要處理異常時關閉
With是一個上下文管理器:操作的是open後返回的f,會幫助關閉文件,相當於執行了self.close
#保存文件 with open("./demo.jpg","wb") as f: f.write(file_obj.read()) |