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())

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