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
$ python hello.py * Running on http://127.0.0.1:5000/
访问 http://127.0.0.1:5000/ ,会看见 Hello World 问候。欲关闭服务器,按 Ctrl+C。flask
这段代码作了什么?浏览器
首先,咱们导入了 Flask 类。这个类的实例将会是咱们的 WSGI 应用程序
2.接下来,咱们建立一个该类的实例,第一个参数是应用模块或者包的名称。 若是你使用单一的模服务器
块(如本例),你应该使用 name ,由于模块的名称将会因其做为单独应用启动仍是做为模
块导入而有不一样( 也便是 '__main__' 或实际的导入名)。这是必须的,这样 Flask 才知道到哪
去找模板、静态文件等等。 详情见 Flask的文档。app
而后,咱们使用 route() 装饰器告诉 Flask 什么样的URL 能触发咱们的函数。
4.这个函数的名字也在生成 URL 时被特定的函数采用,这个函数返回咱们想要显示在用户浏览器中函数
的信息。
5.最后咱们用 run() 函数来让应用运行在本地服务器上。 其中 if name =='__main__': 确保服务器
只会在该脚本被 Python 解释器直接执行的时候才会运行,而不是做为模块导入的时候。post
若是你启用了调试支持,服务器会在代码修改后自动从新载入,并在发生错误时提供一个至关有用的调试器。
有两种途径来启用调试模式:
一种是直接在应用对象上设置:搜索引擎
app.debug = True app.run()
另外一种是做为 run 方法的一个参数传入:编码
app.run(debug=True)
两种方法的效果彻底相同。
【注意】url
交互式调试器绝对不能用于生产环境。
@app.route('/') def index(): return 'Index' @app.route('/hello/') def hello(): return '<h1>Hello world!</h1>'
这个函数的返回值称为响应,是客户端接收到的内容。
像 index() 这样的函数称为视图函数(view function)。视图函数返回的响应可
以是包含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_id
Flask 支持在路由中使用 int、 float 和 path 类型。path 类型也是字符串,但
不把斜线视做分隔符,而将其看成动态片断的一部分。
int | 接受整数
float | 接受浮点数
path | 和默认的类似,但也接受斜线
变量规则的意义:处理动态信息。
【注意】
app.route()函数中中括号里的是变量名,必须与视图函数的形参名一致!
若是是int或float类型,不能直接return!必需要转换为字符串格式才能够,否
则会报错:TypeError: 'int' object is not callable
@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 的惟一,有助于避免搜索引擎索引同一
个页面两次。
用 redirect() 函数把用户重定向到其它地方。
用 abort() 函数放弃请求并返回错误代码。例如:
@app.route('/redir/') def redir(): return redirect('/login/') @app.route('/login/') def login(): abort(401)
用户会从/redir/重定向到一个不能访问的页面 (401 意味着禁止访问)。
用 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 数据,免去你不少麻烦。
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