flask是一种非常容易上手的python web开发框架,不需要我们知道太多的MVC的概念,只需要具备基本的python开发技能,就可以开发出一个web应用来。
flask的官网:http://flask.pocoo.org/(我访问不了,原因你知道的!)
flask中文文档:http://dormousehole.readthedocs.org/en/latest/。
就像文档中提示的,我们可以先读《 安装 》,然后读《 快速上手 》。Flask支持强大的 扩展功能,以各种方式扩展了 Flask 的功能,比如增强对数据库的支持等等。
我是在windows使用FLASK,安装方法非常简单,根据文档的介绍直接在命令行窗口执行
pip install flask
如果最后显示:
Successfully installed flask Werkzeug Jinja2 itsdangerous markupsafe
Cleaning up...
则表示,flask安装成功了。
打开pycharm(一个python开发工具),点击File->New Project...,输入Project name,Location和python解释器,如下图。点击OK。
在项目文件夹上点击右键,选择New->Python File,命名为app来作为应用程序的名称,请不要使用 flask.py 作为应用名称,这会与 Flask 本身发生冲突。
下面在app.py文件中,编写flask程序。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
这段代码的含义是:
run() 方法可以方便地启动一个本地开发服务器,每次修改应用之后都需要手动重启服务器。如果想要每次修改应用之后,服务器能够自动重启,那么可以打开调试模式。并且当应用出错时还会提供一个有用的调试器。
方法是将app.run()改为app.run(debug=True)
现在我们把app应用进行一下调整,让它出错,这样在执行的时候,就会自动调出调试器。app应用改为如下:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
a = 1
b = '1'
c = a + b
return 'Hello world!'
if __name__ == '__main__':
app.run(debug = True)
运行上面这段代码,将在pycharm的控制台输出:
C:\Python27\python.exe C:/Users/Administrator/PycharmProjects/flaskexample/app.py
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
现在我们在浏览器中访问http://127.0.0.1:5000/,我们将会看到调试界面,在调试界面里面可以看出程序的错误信息:
我们可以在出错的位置调出interactive pyhon shell来执行python脚本进行调试,例如在 ‘c = a + b’那一行的最右边,点击‘Open an interactive pyhon shell in this frame’:
由于交换式调试器允许执行任意代码,这样会成为一个重大安全隐患。因此, 绝对不能在生产环境中使用调试器 。运行服务器后,会发现只有你自己的电脑可以使用服务,而网络中的其他电脑却不行。缺省设置就是这样的,因为在调试模式下该应用的用户可以执行你电脑中的任意Python 代码。如果你关闭了 调试 或信任你网络中的用户,那么可以让服务器被公开访问。只要像这样改变 run() 方法的调用:
app.run(host='0.0.0.0')
route() 装饰器用于把一个函数绑定到一个 URL 。我们修改第三节的程序如下:
from flask import Flask
app = Flask(__name__)
@app.route('/hello')
def hello_world():
return 'Hello world!'
if __name__ == '__main__':
app.run()
如上,我们把hello_world这个函数绑定到路由'/hello'。这是我们在访问‘http://127.0.0.1:5000/’的时候将不会显示hello world,以为我们将hello_world函数绑定到了‘/hello’路由下,因此我们需要访问‘http://127.0.0.1:5000/hello’才能显示‘hello world’。
route() 不仅仅能够绑定路由,还可以动态变化URL的某些部分。我们将程序修改如下:
from flask import Flask
app = Flask(__name__)
@app.route('/user/')
def hello_world(user):
return 'Hello %s' % user
if __name__ == '__main__':
app.run()
运行上面的程序,在浏览器地址栏输入‘http://127.0.0.1:5000/user/liuchunming’,将会返回‘Hello liuchunming’。
通过把 URL 的一部分标记为
@app.route('/post/')
def show_post(post_id):
# show the post with the given id, the id is an integer
return 'Post %d' % post_id
现有的转换器有:
int,
float,
path。
加入有两个路由:
@app.route('/projects/')
def projects():
return 'The project page'
@app.route('/about')
def about():
return 'The about page'
它们看上去很相近,不同之处在于 URL
定义 中尾部的斜杠。
第一个例子中prjects 的 URL 是中规中举的,尾部有一个斜杠,看起来就如同一个文件夹。访问一个没有斜杠结尾的 URL 时 Flask 会自动进行重定向,帮你在尾部加上一个斜杠。
但是在第二个例子中, URL 没有尾部斜杠,因此其行为表现与一个文件类似。如果访问这个 URL 时添加了尾部斜杠就会得到一个 404 错误。
为什么这样做?因为这样可以在省略末尾斜杠时仍能继续相关的 URL 。这种重定向行为与 Apache 和其他服务器一致。同时, URL 仍保持唯一,帮助搜索引擎不重复索引同一页面。
缺省情况下,一个路由只回应 GET 请求,但是可以通过 methods 参数使用不同方法,例如PUT GET POST DELETE等。
我们修改第三节的程序如下:
from flask import Flask
app = Flask(__name__)
@app.route('/', methods=['POST'])
def hello_world(user):
return 'Hello %s' % user
if __name__ == '__main__':
app.run()
在浏览器中输入‘http://127.0.0.1:5000/liuchunming’,浏览器提示: