Python微型web开发框架flask介绍及一个小例子

转自http://blog.csdn.net/liuchunming033/article/details/45536211

1、FLASK简介

flask是一种非常容易上手的python web开发框架,不需要我们知道太多的MVC的概念,只需要具备基本的python开发技能,就可以开发出一个web应用来。

flask的官网:http://flask.pocoo.org/(我访问不了,原因你知道的!)

flask中文文档:http://dormousehole.readthedocs.org/en/latest/。

就像文档中提示的,我们可以先读《 安装 》,然后读《 快速上手 》。Flask支持强大的 扩展功能,以各种方式扩展了 Flask 的功能,比如增强对数据库的支持等等。

2、FLASK安装

我是在windows使用FLASK,安装方法非常简单,根据文档的介绍直接在命令行窗口执行

[plain]  view plain  copy
  1. pip install flask  
如果最后显示:

Successfully installed flask Werkzeug Jinja2 itsdangerous markupsafe
Cleaning up...

则表示,flask安装成功了。

3、FLASK的小栗子

打开pycharm(一个python开发工具),点击File->New Project...,输入Project name,Location和python解释器,如下图。点击OK。

 在项目文件夹上点击右键,选择New->Python File,命名为app来作为应用程序的名称,请不要使用 flask.py 作为应用名称,这会与 Flask 本身发生冲突。

下面在app.py文件中,编写flask程序。

[python]  view plain  copy
  1. from flask import Flask  
  2. app = Flask(__name__)  
  3.  
  4. @app.route('/')  
  5. def hello_world():  
  6.     return 'Hello World!'  
  7.   
  8. if __name__ == '__main__':  
  9.     app.run()  

这段代码的含义是:

  • 首先我们导入 Flask 类。这个类的实例将会成为我们的 WSGI应用。
  • 接着我们创建这个类的实例。第一个参数是应用模块或者包的名称。如果你使用一个单一模块(就像本例),那么应当使用 __name__ ,因为名称会根据这个模块是按应用方式使用还是作为一个模块导入而发生变化(可能是'__main__' ,也可能是实际导入的名称)。这个参数是必需的,这样 Flask 就可以知道在哪里找到模板和静态文件等东西。更多内容详见Flask 文档。
  • 然后我们使用 route() 装饰器来告诉 Flask 触发函数的 URL,这里绑定到了根目录,意思就是说当输入IP和PROT之后就可以访问hello_world函数 。
  • 函数名称可用于生成相关联的 URL ,并返回需要在用户浏览器中显示的信息。
  • 最后,使用 run() 函数来运行本地服务器和我们的应用。if__name__== '__main__': 确保服务器只会在使用 Python 解释器运行代码的情况下运行,而不会在作为模块导入时运行。

4、调试模式

run() 方法可以方便地启动一个本地开发服务器,每次修改应用之后都需要手动重启服务器。如果想要每次修改应用之后,服务器能够自动重启,那么可以打开调试模式。并且当应用出错时还会提供一个有用的调试器。

方法是将app.run()改为app.run(debug=True)

现在我们把app应用进行一下调整,让它出错,这样在执行的时候,就会自动调出调试器。app应用改为如下:

[python]  view plain  copy
  1. from flask import Flask  
  2.   
  3. app = Flask(__name__)  
  4.  
  5. @app.route('/')  
  6. def hello_world():  
  7.     a = 1  
  8.     b = '1'  
  9.     c = a + b  
  10.     return 'Hello world!'  
  11.   
  12. if __name__ == '__main__':  
  13.     app.run(debug = True)  
运行上面这段代码,将在pycharm的控制台输出:

[python]  view plain  copy
  1. C:\Python27\python.exe C:/Users/Administrator/PycharmProjects/flaskexample/app.py  
  2.  * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)  
  3.  * Restarting with stat  
现在我们在浏览器中访问http://127.0.0.1:5000/,我们将会看到调试界面,在调试界面里面可以看出程序的错误信息:

我们可以在出错的位置调出interactive pyhon shell来执行python脚本进行调试,例如在 ‘c = a + b’那一行的最右边,点击‘Open an interactive pyhon shell in this frame’:


由于交换式调试器允许执行任意代码,这样会成为一个重大安全隐患。因此,  绝对不能在生产环境中使用调试器  。

5、让其他电脑访问你的服务

运行服务器后,会发现只有你自己的电脑可以使用服务,而网络中的其他电脑却不行。缺省设置就是这样的,因为在调试模式下该应用的用户可以执行你电脑中的任意Python 代码。如果你关闭了 调试 或信任你网络中的用户,那么可以让服务器被公开访问。只要像这样改变 run() 方法的调用:

[python]  view plain  copy
  1. app.run(host='0.0.0.0')  

6、路由

route() 装饰器用于把一个函数绑定到一个 URL 。我们修改第三节的程序如下:

[python]  view plain  copy
  1. from flask import Flask  
  2.   
  3. app = Flask(__name__)  
  4.  
  5. @app.route('/hello')  
  6. def hello_world():  
  7.     return 'Hello world!'  
  8.   
  9. if __name__ == '__main__':  
  10.     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的某些部分。我们将程序修改如下:

[python]  view plain  copy
  1. from flask import Flask  
  2.   
  3. app = Flask(__name__)  
  4.  
  5. @app.route('/user/<user>')  
  6. def hello_world(user):  
  7.     return 'Hello %s' % user  
  8.   
  9. if __name__ == '__main__':  
  10.     app.run()  
运行上面的程序,在浏览器地址栏输入‘http://127.0.0.1:5000/user/liuchunming’,将会返回‘Hello liuchunming’。

7、变量规则

通过把 URL 的一部分标记为 <variable_name> 就可以在 URL 中添加变量。标记的部分会作为关键字参数传递给函数。通过使用<converter:variable_name> ,可以选择性的加上一个转换器,为变量指定规则。请看下面的例子:

[python]  view plain  copy
  1. @app.route('/post/<int:post_id>')  
  2. def show_post(post_id):  
  3.     # show the post with the given id, the id is an integer  
  4.     return 'Post %d' % post_id  
现有的转换器有: int float path

8、唯一的 URL / 重定向行为

加入有两个路由:

[python]  view plain  copy
  1. @app.route('/projects/')  
  2. def projects():  
  3.     return 'The project page'  
  4.  
  5. @app.route('/about')  
  6. def about():  
  7.     return 'The about page'  
它们看上去很相近,不同之处在于 URL  定义  中尾部的斜杠。

第一个例子中prjects 的 URL 是中规中举的,尾部有一个斜杠,看起来就如同一个文件夹。访问一个没有斜杠结尾的 URL 时 Flask 会自动进行重定向,帮你在尾部加上一个斜杠。
但是在第二个例子中, URL 没有尾部斜杠,因此其行为表现与一个文件类似。如果访问这个 URL 时添加了尾部斜杠就会得到一个 404 错误。

为什么这样做?因为这样可以在省略末尾斜杠时仍能继续相关的 URL 。这种重定向行为与 Apache 和其他服务器一致。同时, URL 仍保持唯一,帮助搜索引擎不重复索引同一页面。

9、HTTP方法

缺省情况下,一个路由只回应 GET 请求,但是可以通过 methods 参数使用不同方法,例如PUT GET POST DELETE等。

我们修改第三节的程序如下:

[python]  view plain  copy
  1. from flask import Flask  
  2.   
  3. app = Flask(__name__)  
  4.  
  5. @app.route('/<user>', methods=['POST'])  
  6. def hello_world(user):  
  7.     return 'Hello %s' % user  
  8.   
  9. if __name__ == '__main__':  
  10.     app.run()  
在浏览器中输入‘http://127.0.0.1:5000/liuchunming’,浏览器提示:

Method Not Allowed

这是因为浏览器使用的是put方法访问的路由,而我们的hello_world支持的是POST方法,所以报错。

猜你喜欢

转载自blog.csdn.net/ss654271961/article/details/78837798