WEB开发是现在程序必会的技能,因为大部分软件都以Web形式提供,及时制作后台开发,或者只做前台开发,也需要了解Web开发的概念和特点。由于Python是解释性脚本语言,用来做Web开发非常适合,而且Python有上百种Web开发框架,以及成熟的模板技术,使得Web开发如虎添翼。今天借用Flask框架,快速学习一下Python的Web开发知识。
Flask框架
Flask的设计易于使用和扩展。它的初衷是为各种复杂的Web应用程序构建坚实的基础。可以自由地插入任何扩展。也可以自由构建自己的模块。Flask适合各种项目。它对原型设计特别有用。Flask依赖于两个外部库:Jinja2模板引擎和Werkzeug WSGI工具包。Flask是最精致,功能最丰富的微框架之一。Flask还很年轻,拥有蓬勃发展的社区,一流的扩展和漂亮的API。Flask具有快速模板,强大的WSGI功能,在Web应用程序和库级别的完整单元可测性,以及大量文档等优点。选用Flask框架也是因为它方便入手,结构简单,零配置,是个学习Python Web开发的好工具。
安装Flask
像其他模块一样,Flask的安装很简单,下面通过pip包管理器来安装
pip install flask
检查一下是否安装正确 在命令行下输入 python
进入命令行模式 引入flask模块 回车
>>> import flask
如果没有错误提醒,就说明安装成功了
Hello world
下面写个最简单的Web应用 hello.py
from flask import Flask # 引入Flask模块
打开终端,跳转到hello.py
文件所在的文件夹,进入python命令行模式,启动服务
>>> python hello.py
如果一起正常的话会有类似下面的反馈
* Serving Flask app "hello" (lazy loading)
因为是通过
app.run()
启动的服务,所以会有个错误提示,提醒不能将此Web应用部署在生产环境中,可以暂时忽略
此时,打开浏览器,输入 127.0.0.1:5000/ 或者 localhost:5000/, 就可以看到 Hello World!欢迎字样。
路由
路由是Web开发中一个很重要的概念,用来将不同的请求,映射到响应的处理方法上,这个方法被称为视图函数。比如刚才的Hello
应用,将根请求,映射到index
处理方法上,下面简单了解下Flask对路由的支持 Flask通过修饰器(和Java的注解类似)来建立路由映射关系的,已经看到修饰器是app.rotue()
简单路由
如 访问 /hello
@app.route('/hello')
动态路由
如访问 /user/bob
或者 /user/lily
都会映射到同一视图函数上
@app.route('/user/<name>')
动态域名中动态的部分可以作为视图函数的参数,也支持多个动态参数,如访问 /user/bob/23
@app.route('/user/<name>/<age>')
还可以指定动态部分的数据类型,如
@app.route('/post/<int:post_id>')
支持的数据类型
类型 | 说明 |
string | (默认值) 任何不包含斜杠的文本 |
int | 正整数 |
float | 正浮点数 |
path | 类似 string ,但可以包含斜杠 |
uuid | 接受 UUID 字符串 |
指定HTTP 方法
HTTP协议,支持多种HTTP 方法,例如HEAD
、OPTIONS
,以及常用的GET
、POST
等,Flask自动处理了HEAD
和OPTIONS
,路由默认接受的方法是GET,如果要匹配其他请求方法,可以在路由方法的methods
参数来指定
@app.route('/login', methods=['GET', 'POST'])
复合路由
也可以将多个路由规则,用于一个视图函数, 如访问/job/
和访问 /work/
效果是一样的
@app.route('/job/')
再复杂一点的例子
@app.route('/users/', defaults={'page': 1})
上面的代码表示,当访问/user/
或者 /user/page/<pageindex>
时,都会有show_users
视图函数来处理, 而且还为/user/
提供了默认值,即访问/user/
相当于访问 /user/page/1
请求和响应
Web应用,最重要的事情就是处理接收到的请求,并返回响应。Flask框架也一样,它提供了请求对象request
和响应对象response
,可以方便的在视图函数中使用。
请求
Flask将客户端发送的HTTP请求封装成了request
请求对象,并且使用上下文(context)临时将request
变为全局可访问的,于是在视图还是中,就可以直接使用了。
注意:
request
并非真正的全局变量!试想,在多线程服务器中,多个线程同时处理不同客户端发送的不同请求时,每个线程看到的request
对象必然不同。Falsk使用上下文让特定的变量在一个线程中全局可访问,与此同时却不会干扰其他线程。
Flask有两种上下文,分别为程序上下文和请求上下文,各自对应的全局变量如下表:
变量名 | 上下文类型 | 备注 |
current_app | 程序上下文 | 表示当前运行的程序实例 |
g | 程序上下文 | 处理请求时用作临时存储对象,每次请求都会重新设值 |
request | 请求上下文 | 客户端发来的request请求对象 |
session | 请求上下文 | 请求携带的会话信息 |
使用request
对象前,需要先引入
from flash import request
request
对象提供了丰富的属性和方法,这里举个例子:通过使用 method
属性可以操作当前请求方法,通过使用 form
属性处理表单数据(在 POST
或者 PUT
请求 中传输的数据)。以下是使用上述两个属性的例子:
@app.route('/login', methods=['POST', 'GET'])
注意:当 form 属性中不存在这个键时会发生什么?会引发一个 KeyError 。如果不处理这个错误 ,就会显示一个 HTTP 400 Bad Request 错误页面。
如果要操作 URL (如 ?key=value )中提交的参数可以使用 args 属性,如 : searchword = request.args.get('key', '')