一个小应用
创建一个Python文件:hello.py
from flask import Flask app = Flask(__name__) #app是程序实例,一个项目只能有一个程序实例@app.route(‘/‘) #路由装饰器def hello_world(): #视图函数 return ‘Hello World!‘ #返回一个字符串if __name__ == ‘__main__‘: app.run()1234567812345678
用python解释器来运行
$ python hello.py * Running on http://127.0.0.1:5000/1212
上面代码
- 首先,我们导入了 Flask 类。这个类的实例将会是我们的 WSGI 应用程序
- 接下来,我们创建一个该类的实例,第一个参数是应用模块或者包的名称。 如果你使用单
块(如本例),你应该使用 name ,因为模块的名称将会因其作为单独应用启动还是作
块导入而有不同( 也即是 ‘main’ 或实际的导入名)。这是必须的,这样 Flask 才知道
去找模板、静态文件等等。详情见 Flask的文档。 - 然后,我们使用 route() 装饰器告诉 Flask 什么样的URL 能触发我们的函数。
- 这个函数的名字也在生成 URL 时被特定的函数采用,这个函数返回我们想要显示在用户浏
的信息。 - 最后我们用 run() 函数来让应用运行在本地服务器上。 其中 if name ==’main‘: 确保服
只会在该脚本被 Python 解释器直接执行的时候才会运行,而不是作为模块导入的时候。
关闭服务器,按 Ctrl+C。
# 修改调用 run() 的方法使你的服务器公开可用 app.run(host=‘0.0.0.0‘)123123
调试代码
虽然 run() 方法适用于启动本地的开发服务器,但是你每次修改代码后都要手动重启它。这样并不够
优雅,而且 Flask 可以做到更好。如果你启用了调试支持,服务器会在代码修改后自动重新载入,并
在发生错误时提供一个相当有用的调试器。就算出错了,也不用重新启动。
有两种途径来启用调试模式。一种是直接在应用对象上设置:
app.debug = True app.run()1212
另一种是作为 run 方法的一个参数传入:
app.run(debug=True)11
两种方法的效果完全相同。
路由装饰器
这里是一些基本的例子:
@app.route(‘/‘) def index(): return ‘Index‘@app.route(‘/hello/‘) def hello(): return ‘<h1>Hello world!</h1>‘12345671234567
客户端(例如 Web 浏览器)把请求发送给 Web 服务器, Web 服务器再把请求发送给 Flask程序实例。程序实例需要知道对每个 URL 请求运行哪些代码,所以保存了一个 URL 到Python 函数的映射关 系。处理 URL 和函数之间关系的程序称为路由。
在 Flask程序中,定义路由使用 app.route修饰器,route()装饰器把一个函数绑定到对应的URL上。
函数的返回值叫响应,是客户端接收到的内容。如果客户端是 Web 浏览器, 响应就是显示给 用户查看的文档。
像index()这样的,称为是视图函数。视图函数返回的响应可以是包含html的简单字符串,也可以是复杂的表单。
变量规则
@app.route(‘/user/<name>‘)def showUserName(name): return "User %s" %[email protected](‘/post/<int:post_id>‘) def showPostId(post_id): return "Post %d" %post_id12345671234567
很多URL地址都包含可变部分。flask中,只需在route修饰器中使用特殊的句法
尖括号的内容就是动态部分,任何能匹配静态部分的URL都会映射到这个路由上。调用视图函数的时候,flask会将动态部分作为参数传入函数中。
路由中的动态部分默认是使用字符串,不过也可以使用类型定义。。例如,路由 /user/只会匹配动 态片段 id 为整数的 URL。 Flask 支持在路由中使用 int、 float 和 path 类型。path 类型也是字符串,但不把斜线视作分隔符,而将其当作动态片段的一部分。
变量规则就是处理动态信息的。
【注意】
- app.route()函数中尖括号里面的是变量名,必须和视图函数的形参名一致
- 如果是int或者float类型,不能直接return。必须转换为字符串格式才可以,否则会报错: TypeError: ‘int’ object is not callable
重定向和错误
- 用redirect()函数把用户重定向到其他地方
- 用abort()函数放弃请求并返回错误代码
@app.route(‘/redir/‘) def redir(): return redirect(‘/login/‘)@app.route(‘/login/‘) def login(): abort(401)1234567812345678
用户会从/redir/重定向到一个不能访问的页面 (401 意味着禁止访问)。
造URL
用url_for()来给指定的函数生成url。它接受函数名作为第一个参数,也接受对应URL规则的变量部分的命名参数。
@app.route(‘/world/‘) def world(): # return redirect(‘/hello/‘) # return redirect(url_for(‘hello‘)) # return redirect(url_for(‘showUserName‘,name = ‘liusheng‘)) return redirect(url_for(‘showPostId‘, post_id = 100)) # 注意这里的100可以是字符串也可以是整型12345671234567
使用url_for()生成 URL 的好处:
- 允许一次性修改 URL,而不用到处边找边改。
- URL 构建会转义特殊字符和 Unicode 数据,免去你很多麻烦。
使用Flask-Script支持命令行选项
Flask-Script是一个Flask扩展,为Flask程序添加了一个命令行解析器。Flask-Script 自带了 一组常用选项,而且还支持自定义命令。
Flask-Script 扩展使用 pip 安装:
(venv) $ pip install flask-script11
把命令行解析功能添加到 hello.py 程序中时需要修改的地方:
from flask_script import Manager manager = Manager(app)if __name__ == ‘__main__‘: manager.run()1234512345
这样修改之后,程序可以使用一组基本命令行选项。
我们运行 python hello.py runserver 来启动 Web 服 务器。
还有很多选项来代替app的debug和host属性:
--host HOST 设置host为 HOST --port PORT 设置port为 PORT-d 设置以debug模式运行而非run模式 -r 设置自动重新载入(app.debug为True)12341234
命令:
python hello.py runserver -d -r --host 0.0.0.011