flask路由

flask路由

url传参的两种方式

动态路由传参

@app.route('/student_list/<student_id>/')
def student_list(student_id):
    return f'学生{student_id}号的信息'

image.png

动态路由的过滤

我们可以对上面的参数student_id限定数据类型,比如限定他为整型

@app.route('/student_list/<int:student_id>/')
def article_detail(student_id):
    return f'学生{student_id}号的信息'

主要有这几种类型过滤

string:默认的数据类型,接受没有任何斜杠“/”的字符串

int:整型

float:浮点型

path:和string类型相似,但是接受斜杠,eg:可以接受参数/aa/bb/cc多条放在一起

uuid:只接受uuid格式的字符串

补充

any可以指定多种路径,url_path的变量名是自己定义的

@app.route('/<any(student,class):url_path>/<id>/')
def item(url_path, id):
    if url_path == 'student':
        return f'学生{id}号的信息'
    else:
        return f'班级{id}号的信息'

动态路由的适用场景

如果想增加网站的曝光率,可以考虑使用动态路由,因为是把path作为参数,搜索引擎的算法会定义你为一个静态页面,不会经常改变,有利于搜索引擎的优化。

上面我们接受参数使用的是path(路径)形式,这种传参的形态就叫做动态路由传参,有利于搜索引擎的优化

查询字符串传参

如果我们在浏览器中输入www.baidu.com/s?wd=python&ad=flask的参数,这个?后的key=value便是查询字符串,可以写多个key=value用&相连,将查询字符串作为参数去请求flask程序

在用查询字符串传参的时候需要从flask模块里面导入request对象,用request.args属性在程序中根据查询字符串的key取出查询字符串的value

argsrequest的一个属性,本质是一个Werkzeug依赖包的immutableMultiDict的对象,用于解析传入查询字符串,immutableMultiDict也继承了Dict类,所以可以使用字典的.get方法来获取,如果我们有获取原生未解析的原生查询字符串的需求,可以使用query_string属性

@app.route('/student_list/')
def student_list():
    name = request.args.get("name")
    age = request.args.get("age")
    return f"学生{name},年龄{age}"

image.png

url_for()的使用

url_for()的原理

利用视图函数名字一般不会改变的特性,去动态精准的获取url,以便于开发使用

url_for('视图函数名字')     #输出该视图函数的url
from flask import Flask, url_for

app = Flask(__name__)


@app.route('/')  # 匹配url
def hello_world():
    print(url_for("book"))
    return url_for("book")   #注意,这个引用的是视图函数的名字 字符串格式

@app.route('/book_list/')
def book():
    return 'flask_book'

image.png

url_for()如何动态的处理函数

如果想获取动态路由,必须以关键词实参的形式为动态的path部分赋值,注意动态的path部分必须被赋值

@app.route('/')  # 匹配url
def hello_world():
    book_url = url_for("book", id=5, name="English")
    print(book_url)
    return book_url  

@app.route('/book_list/')
def book(id):
    return f'book{id}'

浏览器显示:

image.png

url_for()如何为url添加查询字符串

如果想在路径后面拼出来查询字符串,以关键词实参的形式放到url_for()里面作为参数,会自动拼接成路径

这个你可以看上面一个案例和图片,我在上面写了id和name两个关键词参数,在输出的时候,他已经给我自动拼接了,把name=English看见了吗,就是这个意思哈

自定义动态路由过滤器

自定义动态路由过滤器之正则匹配

我们可以通过继承Werkzeug.routingBaseConverter类从而自己定义一个动态路由过滤器规则

from flask import Flask
from werkzeug.routing import BaseConverter


app = Flask(__name__)
app.debug =True

class Telephone(BaseConverter):
    regex = '1[3587]\d{9}'


app.url_map.converters['tel'] = Telephone

@app.route('/student/<tel:telenum>/')
def student_detail(telenum):
    return f"学生的手机号为{telenum}"

if __name__ == '__main__':
    app.run()

image.png

电话号码不符合正则规则是会报错的

注意

  • 自定义路由过滤器类,该类必须继承werkzeug.routing BaseConverter
  • 通过redex属性指定路由规则
  • 将自定义类映射到app.url_map.converters中(其本质是一个字典),app.url_map.converters['tel'] = Telephone

自定义动态路由过滤器之处理动态路由

自定义一个类,该类通过继承Werkzeug.routingBaseConverter类不光实现正则匹配,有两个方法:

  • 在该类中实现to_python方法:

    这个方法的返回值,将会传递给视图函数的参数,我们可以利用这个方法实现处理url中动态路由部分.

  • 在该类中实现to_url方法:

    我们传入指定的动态路由部分,触发to_url方法,这个方法的返回值 ,会拼接在非动态路由上,从而实现生成符合要求的url格式

from flask import Flask, url_for
from werkzeug.routing import BaseConverter

app = Flask(__name__)
app.debug = True


class ListConverter(BaseConverter):
    regex = '.*'

    def to_python(self, value):
        '''
        这个函数用于拿到了路由里的动态参数赋值给value,
        可以在to_python进行操作动态参数,
        返回操作完的的结果给视图函数的形参
        '''
        return value.split('+')

    def to_url(self, value):
        '''
        这个函数用于和url_for连用,
        url_for通过指定给动态参数(以关键字实参的形式)赋值给value
        我们可以根据我们的需求操作url_for传进来的参数,
        然后返回一个理想的动态路由内容拼接在url上
        '''
        return "+".join(value)


app.url_map.converters['list'] = ListConverter


@app.route('/student_list/<list:students>/')
def student_detail(students):
    print(url_for('student_list', students=['a', 'b']))   #输出/student_list/a+b/
    return f"学生{students}"


if __name__ == '__main__':
    app.run()

image.png

以上证明to_python方法在访问的时候把部分路由处理为了列表

image.png

以上证明to_url方法将url_for函数传入的动态路由部分从列表转换成拼接字符串了

posted @ 2020-02-27 19:34  JIAYIYAN  阅读(318)  评论(0编辑  收藏  举报