文章目录

这一章的重点是介绍路由与视图函数,但同时还会介绍一个完整的程序的基本结构。

那么我们来看一个完整的应用hello.py。在上一章中,我们创建了一个playwithflask文件夹,现在请在这个文件夹里创建一个hello.py文件,然后输入以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index(): #这里是python定义函数的语法
return '<h1>Hello world!</h1>'

@app.route('/user/<name>')
def user(name):
return '<h1>Hello, %s!</h1>' % name #这里是python中使用格式转换符的语法

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

前端的同学,你们看不懂是吧?没关系,现在来解释一下这段python代码是什么意思,做了什么。

1.首先,我们之前下载安装了flask,现在就从flask包里导入Flask这个类,因为接下来要用到。这里涉及到python面向对象的知识,Flask类定义在flask里,它有着许多属性和方法(属性可以理解为一些特质,就像人类有眼耳口鼻,方法可以理解为行为,就像人类会说话会走路一样),现在你只要知道这些就够了。

2.然后,我们就创建一个Flask类的实例,它叫app。因为app是Flask类,所以它有着Flask类的属性和方法。Flask类里有着一个构造函数,当我们实例化Flask类创造app的时候,这个构造函数就会被调用,这个函数里有一个必须要传入的参数,就是程序主模块或包的名称。这个参数决定着程序的根目录。如果你使用单一的模块,你应该使用__name__ ,因为模块的名称将会因其作为单独应用启动还是作为模块导入而有不同(也就是‘__main__’或实际的导入名)。这里的hello.py就是一个单一的模块,所以使用__name__就好了。

3.接下来这两段代码就叫做路由。这里使用到了app实例里的route装饰器。装饰器又是什么?装饰器实际上也是一个函数,它是一个接受另一个函数作为参数的函数。也就是说,这里的:

1
2
3
@app.route('/'):
def index():
return '<h1>Hello world!</h1>'

就相当于:

1
2
3
4
def index():
return '<h1>Hello world!</h1>'

app.route('/', index)

所以说route装饰器也是一个函数,至于它怎么定义的现在你不用管,你只要知道它的作用就够了。它的作用就是将URL和函数绑定。当在浏览器请求这个URL时,与之绑定的函数就会被调用,然后函数的返回值会发送给浏览器。而这个与URL绑定了的函数就叫做视图函数。而URl和视图函数之间的这种对应关系叫URL映射,这会在下一节中详细介绍。

4.好,看回hello.py里的第二个路由,它有点特别,它是一个动态路由。看到后面那个了吧,这个叫通配符,就是它可以随着你传入的值而变动,是一个动态的部分。调用视图函数时,Flask会将动态部分作为参数传入函数,然后返回给浏览器。

5.最后的app.run()的意思是调用run()函数,让hello.py运行在本地服务器上,可以把指定的域名和端口作为参数传入。if__name__==’__main__‘的意思是,当这个hello.py被Python解释器直接执行的时候才会运行服务器,作为模块导入时就不会。debug=True的意思就是将run()函数里的debug参数的值设置为True,表示启用调试模式(在调试模式下,程序运行时被修改会自动重载)。

嗯,终于弄明白这段代码了。来运行这个程序看看。

1
2
3
4
5
(venv) $ python hello.py
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger pin code: 246-018-741

现在这个程序运行在本地的服务器上了,那么现在打开浏览器,在地址栏输入http://127.0.0.1:5000/ , 然后我们就会看到:

这里访问了’/‘,即程序的根地址,于是调用了index()视图函数,即第一个路由。

如果我们输入http://127.0.0.1:5000/user/rose/ , 那么就会看到:

这里访问了’/user/rose’,用到了第二个路由,并且给name这个动态参数传入了rose这个值。

至此,路由和试图函数的部分就介绍完了。实际上,在本章不仅仅介绍了路由和试图函数,而把把一个完整的程序的基本结构都介绍了一遍。

Last: Flask学习教程 Part1 1:Flask简介及安装
Next: Flask学习教程 Part1 2.2:请求与响应

文章目录