Flask程序运行过程
所有Flask程序必须有一个程序实例。
Flask调用视图函数后,会将视图函数的返回值作为响应的内容,返回给客户端。一般情况下,响应内容主要是字符串和状态码。
当客户端想要获取资源时,一般会通过浏览器发起HTTP请求。此时,Web服务器使用WSGI(Web Server Gateway Interface)协议,把来自客户端的所有请求都交给Flask程序实例。WSGI是为 Python 语言定义的Web服务器和Web应用程序之间的一种简单而通用的接口,它封装了接受HTTP请求、解析HTTP请求、发送HTTP,响应等等的这些底层的代码和操作,使开发者可以高效的编写Web应用。
程序实例使用Werkzeug来做路由分发(URL请求和视图函数之间的对应关系)。根据每个URL请求,找到具体的视图函数。 在Flask程序中,路由的实现一般是通过程序实例的route装饰器实现。route装饰器内部会调用add_url_route()方法实现路由注册。
调用视图函数,获取响应数据后,把数据传入HTML模板文件中,模板引擎负责渲染响应数据,然后由Flask返回响应数据给浏览器,最后浏览器处理返回的结果显示给客户端。
示例:
# 当前文件的编码声明要写出来
# coding:utf-8
from flask import Flask # 这里不可以导入* 这样不知道从当前包里导入了什么容易和其他的有冲突
# 创建flask应用对象
# __name__ 是一个魔法变量, 当前文件所在的模块的名字
# 意义: 在flask中会默认以当前模块所在的目录为总目录, 默认这个目录中的static为静态目录, templates为模板目录
app = Flask(__name__)
@app.route("/")
def index():
'''定义视图函数'''
return "hello flask"
if __name__ == '__main__':
'''启动flask程序'''
app.run()
然后我们执行 python3 hello.py
运行. 到浏览器中就可以看到
(Flask_py3) xxzxdeMacBook-Pro:Code xxzx$ python3 hello.py
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [07/Jan/2019 15:34:39] "GET / HTTP/1.1" 200 -
我们都知道, 当前模块运行的时候就会走下面的代码.
if __name__ == '__main__':
那为什么要这么写呢, 而我们在创建Flask应用的时候传入的__name__
又代表什么呢?
我们来测试一下:
新建一个demo.py
我们可以看到打印的是__main__
, 但这并不是绝对的. 如果我们把这个模块作为启动模块, 那这个模块的名字就是__main__
, 如果我们把这个模块导入到其他模块中,以hellow.py为启动文件. 如下图
在执行到第5行的时候, demo.py这个文件就会执行. 得到如上图的结果. 我们发现打印的是demo
总结
所以我们可以知道if __name__ == '__main__':
如果判断等于__main__
就会执行下面的代码, 像demo.py作为模块导入到hello.py中. 就不会执行入口函数下面的代码. 所以我们可以直接替换
app = Flask(__name__) ==>> app = Flask("__main__")
是可以达到同样的效果
在flask中, 如果上面我们随便传了一个字符串其实也是可以正确访问的. 虽然下面的判断无法通过, 但是在flask应用中, 会默认到当前文件所在的目录去查找. 但我们不建议这么做. 因为我们在测的时候可能会随便输入一个像abc
这样的字符串去测试发现无法访问. 刚不是说了可以正常访问的吗?这又是为什么呢? 因为我们python的模块的标准库中默认有个模块叫adc, Flask 去这个模块找的时候当然是无法找到了. 所以我们还是要遵守规范.