Flask入门(3):路由

3.路由

3.1 配置路由两种方式

# 配置路由两种方式
from flask import Flask

app = Flask(__name__)

"""
@app.route的流程
    1.执行 decorator = app.route('/index', methods=['POST','GET'])
    3.@decorator,相当于执行 decorator(index)
        执行代码add_url_rule(rule, endpoint, f, **options)     
"""
# 方式一
@app.route('/index', methods=['POST','GET'])
def index():
    return 'Hello World!'


# 方式二
def order():
    return 'order'
app.add_url_rule('/order', view_func=order)


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

3.2 url_for

给指定的函数构造 URL, 它接受函数名作为第一个参数,也接受对应 URL 规则的变量部分的命名参数。未知变量部分会添加到 URL 末尾作为查询参数 。一般与重定向一起使用。

# url_for反向生成url
from flask import Flask, url_for

app = Flask(__name__)


@app.route('/')
def index():
    print(url_for('n1'))
    print(url_for('n2'))
    print(url_for('user', username='cys'))
    return "index"

@app.route('/login', methods=['POST', 'GET'],endpoint='n1')
def login():
    pass

@app.route('/logout', methods=['POST', 'GET'],endpoint='n2')
def logout():
    pass

@app.route('/user/<username>')
def user(username):
    pass


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

    
# 结果如下
# /login
# /logout
# /user/cys

3.3 路由转换器

参考:https://cloud.tencent.com/developer/article/1538653

3.3.1 自带转换器

  • int转换器 <int:param> :接收整数
  • float转换器 <float:param>: 接收浮点数
  • string转换器 <string:param>: 接收string类型(默认则是string转换器
  • path转换器 <path:param>: 和默认的相似,但也接收斜线
# 转换器
from flask import Flask


app = Flask(__name__)


# 转换器 <int:goods_id>
@app.route('/intconverter/<int:params>')
def int_param(params):
    return "-->> %s" % params

# 设置float转换器
@app.route('/floatconverter/<float:params>')
def float_param(params):
    return "-->> %s" % params

# 设置转换器 <string:goods_id>
@app.route('/strconverter/<string:params>')
def str_param(params):
    return "-->> %s" % params

# 设置path转换器
@app.route('/pathconverter/<path:params>')
def path_param(params):
    return "-->> %s" % params

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

3.3.2 自定义万能转换器

需要继承BaseConverter。

使用正则表达式:

# 自定义转换器
from flask import Flask
from werkzeug.routing import BaseConverter

app = Flask(__name__)


# 1.定义自己的转换器
class RegexConverter(BaseConverter):
    """
    自定义转换器
    """

    def __init__(self, url_map, regex):
        # 调用父类的初始化方法
        super(RegexConverter, self).__init__(url_map)
        # 将正则表达式的参数保存到对象属性中,flask会使用这个属性来进行路由的正则匹配
        self.regex = regex
        
    def to_python(self, value):
      # value是从路径里拿到的字符串
      # return出去的是视图函数接受到的值,可以进行转换,例如转成int:return int(value)
      return value


# 2.将自定义的转换器添加到flask应用中
app.url_map.converters['re'] = RegexConverter


# 转换器
@app.route("/tel/<re(r'1[34578]\d{9}'):tel>")
def goods_detail(tel):
    return "tel is {}".format(tel)



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

手机号码转换器

from werkzeug.routing import BaseConverter
class MobileConverter(BaseConverter):
    def __init__(self,url_map,mobile):
        super(MobileConverter, self).__init__(url_map)
        self.regex = r'1[34578]\d{9}'

app.url_map.converters['mobile'] = MobileConverter # 注册

@app.route("/goods/<mobile:goods>")
def goods_detail(goods):
    return "goods id is {}".format(goods)

3.4 视图函数添加装饰器

黑视图添加装饰器一般可用来做一些登录验证、日志记录、全局返回等。

注意点:

1.被同一个装饰器装饰的视图函数,他们的endpoint一样,会报错,所以使用@functools.wraps(func)修饰,使他们为原来自己的函数名

  1. 装饰器一定要写到@app.route下面,不然每次不生效
# 给视图添加装饰器
from flask import Flask
import functools

app = Flask(__name__)


def wapper(func):
    # 被同一个装饰器装饰的视图函数,他们的endpoint一样,会报错,所以使用@functools.wraps(func)修饰,使他们为原来自己的函数名
    @functools.wraps(func)
    def inner(*args, **kwargs):
        print("inner")
        return func(*args, **kwargs)
    return inner


@app.route('/')
@wapper  # 装饰器一定要写到@app.route下面,不然每次不生效
def index():
    return 'index'


@app.route('/order', methods=['GET', 'POST'])
@wapper
def order():
    return 'order'


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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ethan-running

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值