Flask二之快速入门
一.一个最小的Flask应用
from flask import Flask app = Flask(__name__) #app是程序实例,一个项目只能有一个程序实例 @app.route('/') #路由装饰器 def hello_world(): #视图函数 return 'Hello World!' #返回一个字符串 if __name__ == '__main__': app.run()
把程序保存为hello.py 用Python解释器运行
$ python hello.py * Running on http://127.0.0.1:5000/
访问 http://127.0.0.1:5000/ ,会看见 Hello World 问候。欲关闭服务器,按 Ctrl+C。
这段代码做了什么?
首先,我们导入了 Flask 类。这个类的实例将会是我们的 WSGI 应用程序
2.接下来,我们创建一个该类的实例,第一个参数是应用模块或者包的名称。 如果你使用单一的模
块(如本例),你应该使用 name ,因为模块的名称将会因其作为单独应用启动还是作为模
块导入而有不同( 也即是 '__main__' 或实际的导入名)。这是必须的,这样 Flask 才知道到哪
去找模板、静态文件等等。 详情见 Flask的文档。
然后,我们使用 route() 装饰器告诉 Flask 什么样的URL 能触发我们的函数。
4.这个函数的名字也在生成 URL 时被特定的函数采用,这个函数返回我们想要显示在用户浏览器中
的信息。
5.最后我们用 run() 函数来让应用运行在本地服务器上。 其中 if name =='__main__': 确保服务器
只会在该脚本被 Python 解释器直接执行的时候才会运行,而不是作为模块导入的时候。
(1)调试模式
如果你启用了调试支持,服务器会在代码修改后自动重新载入,并在发生错误时提供一个相当有用的调试器。
有两种途径来启用调试模式:
一种是直接在应用对象上设置:
app.debug = True app.run()
另一种是作为 run 方法的一个参数传入:
app.run(debug=True)
两种方法的效果完全相同。
【注意】
交互式调试器绝对不能用于生产环境。
(2)路由装饰器
@app.route('/') def index(): return 'Index' @app.route('/hello/') def hello(): return '<h1>Hello world!</h1>'
这个函数的返回值称为响应,是客户端接收到的内容。
像 index() 这样的函数称为视图函数(view function)。视图函数返回的响应可
以是包含HTML 的简单字符串,也可以是复杂的表单。
(3)变量规则
@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_id
Flask 支持在路由中使用 int、 float 和 path 类型。path 类型也是字符串,但
不把斜线视作分隔符,而将其当作动态片段的一部分。
int | 接受整数
float | 接受浮点数
path | 和默认的相似,但也接受斜线
变量规则的意义:处理动态信息。
【注意】
app.route()函数中中括号里的是变量名,必须与视图函数的形参名一致!
如果是int或float类型,不能直接return!必须要转换为字符串格式才可以,否
则会报错:TypeError: 'int' object is not callable
(4)唯一 URL / 重定向行为
@app.route('/about/') # 建议用法 # @app.route('/about') # 不建议用法 def about(): return 'The about page'
虽然它们看起来着实相似,但它们结尾斜线的使用在 URL 定义 中不同:
- 第一种情况中,指向 about的规范 URL 尾端有一个斜线。这种感觉很像在文件系 统中的文件夹。访问一个结尾不带斜线的 URL 会被 Flask 重定向到带斜线的规范 URL 去。因此, 强烈建议统一加上斜线! - 第二种情况的 URL 结尾不带斜线,类似 UNIX-like 系统下的文件的路径名。访问 结尾带斜线的URL 会产生一个 404 “Not Found” 错误。
这个行为使得在遗忘尾斜线时,允许关联的 URL 接任工作,与 Apache 和其它的服
务器的行为并无二异。此外,也保证了 URL 的唯一,有助于避免搜索引擎索引同一
个页面两次。
(5)重定向和错误
用 redirect() 函数把用户重定向到其它地方。
用 abort() 函数放弃请求并返回错误代码。例如:
@app.route('/redir/') def redir(): return redirect('/login/') @app.route('/login/') def login(): abort(401)
用户会从/redir/重定向到一个不能访问的页面 (401 意味着禁止访问)。
(6)构造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可以是字符串也可以是整型
使用url_for()生成 URL 而非在模板中硬编码的好处:
1. 反向构建通常比硬编码的描述性更好。允许一次性修改 URL,而不用到处边找边改。 2. URL 构建会转义特殊字符和 Unicode 数据,免去你很多麻烦。
(7)使用Flask-Script支持命令行选项
Flask-Script 是一个 Flask 扩展,为 Flask 程序添加了一个命令行解析器。
Flask-Script 自带了一组常用选项,而且还支持自定义命令。
Flask-Script 扩展使用 pip 安装:
(venv) $ pip install flask-script
把命令行解析功能添加到 hello.py 程序中时需要修改的地方:
from flask_script import Manager manager = Manager(app) if __name__ == '__main__': manager.run()
修改之后程序可以使用一组基本命令行选项来启动 Web 服务器。:
python hello.py runserver
--host HOST |设置host为 HOST --port PORT |设置port为 PORT -d |设置以debug模式运行而非run模式 -r |设置自动重新载入(app.debug为True)
标准命令:
python hello.py runserver -d -r --host 0.0.0.0 python hello.py runserver -d -r --port:5001