一个小应用
创建一个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" %name@app.route('/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