要理解路由,首先得理解什么是装饰器(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('/')
def show_user(username):
pass
@app.route('/post/')
def show_post(post_id):
pass
第1个路由:捕获到 “/”,就进入函数进行处理,里面的函数叫做视图函数。URL从左到右第一个“/”为止一般 是首页,因此第1一个路由是处理首页。
第2个路由:捕获到 “/
第3个路由:捕获到 “/post/
还有一些需要注意的URL规则:
1.如果路由中的URL规则是有斜杠结尾的,但是用户请求的时候URL结尾没有斜杠,则会自动将用户重定向到带有斜杠的页面。
2.如果路由中的URL规则结尾不带斜杠的,但是用户请求时带了斜杠,那么就会返回404错误响应。
3.还可以为同一个视图函数,定义多个URL规则:
这指定/users/
将是第1页的URL,并且 /users/page/N
将是第N页的URL