flask web 开发 --- 关于路由app.route

要理解路由,首先得理解什么是装饰器(Decorator),参考廖雪峰python教程中对装饰器的讲解

装饰器:

在代码运行期间,动态的增加函数的功能的方式,称为“装饰器”。

def now():
    print('2015-3-25')

比如我们定义了一个now函数,调用它就回输出一个字符串。现在我们希望给now() 增加一个打印日志的功能,但又不希望修改now()函数的内部代码。我们就定义一个decorator:

def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

现在我们已经定义好了一个decorator:log。它接受一个函数作为参数,返回它自己内部的另一个函数。在使用decorator时,我们使用python的@语法:

@log
def now():
    print('2015-3-25')

我们调用now() 时,运行结果如下:

>>> now()
call now():
2015-3-25

这相当于执行:

now=log(now)

现在,now这个变量不再指向now()函数了,而是指向了log()函数的返回值,也即wrapper函数对象,因此调用now(),相当于调用了wrapper()函数。

以上的decorator是不需要外传入参数的,如果需要再传入参数,则很复杂:

def log(text):
    def decorator(func):
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator

这个三层的decorator用法如下:

@log('execute')
def now():
    print('2015-3-25')

 调用now(),执行的结果如下:

>>> now()
execute now():
2015-3-25

上面的@语句这相当于:

>>> now = log('execute')(now)

分析以上三层函数的decorator:log这个decorator,总共有三层函数,第1层是log(),接受一个字符串,返回第2层函数decorator。而第2层函数decorator接受一个函数作为参数,返回第三层函数wrapper。

执行now()时,相当于执行了log('execute')(now)(),这个语句先执行log('execute'),返回decorator函数。再执行log('execute')(now),相当于执行decorator(now),返回wrapper函数。最后执行log('execute')(now)(),相当于wrapper()。

理解了装饰器的概念,再继续来看路由:

什么是路由:

定义:处理URL和函数之间关系的程序。

简单的说:路由就是将URL绑定到一个函数上面,这样浏览器客户端向web服务器发送一个URL请求后,服务器中的路由收到这个URL后,能立马找到对应的函数进行处理。

查看flask官方文档,其实有三种方式:

根据《Flask Web Development》这本书,我们先了解第1种定义路由的方式。以下三个路由的例子:

@app.route('/')
def index():
    pass

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

@app.route('/post/<int:post_id>')
def show_post(post_id):
    pass

第1个路由:捕获到 “/”,就进入函数进行处理,里面的函数叫做视图函数。URL从左到右第一个“/”为止一般 是首页,因此第1一个路由是处理首页。

第2个路由:捕获到  “/<username>” ,其中尖括号<....> 这一部分是动态可变的部分,其中不可以带有斜杠的。而且这个动态部分当做参数传递给了视图函数。

第3个路由:捕获到 “/post/<int:post_id>”  其中 “/post/”是静态部分,“<int:post_id>”是动态部分,但是这个动态部分必须是个int类型的整数,同样其中不可以带有斜杠。同样这个动态部分也成为参数传入了视图函数show_post。这个rule是 <converter:name>的形式,而converter除了有int,还有float,path,string。

还有一些需要注意的URL规则:

1.如果路由中的URL规则是有斜杠结尾的,但是用户请求的时候URL结尾没有斜杠,则会自动将用户重定向到带有斜杠的页面。

2.如果路由中的URL规则结尾不带斜杠的,但是用户请求时带了斜杠,那么就会返回404错误响应。

3.还可以为同一个视图函数,定义多个URL规则

这指定/users/将是第1页的URL,并且 /users/page/N将是第N页的URL 

  • 14
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值