flask筆記2:視圖函數的路由與request

Table of Contents

01路由規則

02路由提取參數與自定義路由轉換器

Request


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

自定義規則:手機號規則

  1. 定義自己的轉換器,以類定義
  2. 繼承父類werkzeug.routing中的BaseCoverter
  3. 將自定義轉換器類添加到app
  4. 使用剛剛在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())

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章