Flask是基于Python语言编写的一种轻量级的Web框架
Python最出名的框架要数Django
,此外还有Flask
,Tornado
Django与Flask相比,DJnao
就像精装修好的房子,功能比较全面,集成了MVT
,
ORM
,后台站点管理
,但是缺点也非常的明显,什么都得按照Django规定的去做。而
Flask不一样,Flask
比较轻量
,简洁
,有很多第三方的扩展包
,需要什么就拿什么,比较
灵活,这也是Flask受欢迎的原因
比如Flask的一些扩展包:
- Flask-SQLalchemy:操作数据库;
- Flask-migrate:管理迁移数据库;
- Flask-Mail:邮件;
- Flask-WTF:表单;
- Flask-script:插入脚本
- Flask-Login:认证用户状态;
- Flask-RESTful:开发REST API的工具;
- Flask-Bootstrap:继承前端Twitter Boostarp矿浆;
- Flask-Moment:本地日期华时间;
Flask程序运行的过程:
所有Flask程序必须有一个程序实例
。
Flask调用视图函数后,会将函数的返回值作为响应的内容,返回给客户端。一般情况下,响应内容主要是字符串和状态码
当客户端想要获取资源
时,一般会发送HTTP请求
。此时,web服务器使用WSGI协议
,把来自客户端的所有请求都交给Flask程序实例
。WSGI是为Python语言定义的Web服务器和Web应用程序之间的一种简单而通用的接口
,他封装了接收HTTP请求
、解析HTTP请求
、发送HTTP响应
等等的这些底层的代码和操作,可以快速开发
程序实例使用Werkzeug来
做路由的分发
(URL请求和视图函数之间的对应关系)。根据每个URL请求,找到具体的视图函数。在Flask程序中,路由的实现都是通过程序实例的route装饰器
,route装饰器使用add_url_route()
方法实现路由的注册。
调用视图函数,获取响应数据后,把数据传入HTML模板文件中,模板引擎负责渲染数据,然后响应数据给浏览器。
# coding=utf-8
from flask import Flask, abort,make_response,request,current_app # 导入flask类
from settings import Config # 导入配置文件
from werkzeug.routing import BaseConverter
使用Flask 必须使用Flask类创建一个falsk程序实例对象
第一个参数接收包或者模块的名字作为参数,但一般都是传递name
让flask.helpers.get_root_path
函数通过传入的这个名字来确定你程序的根目录,以便获取到静态文件和模板文件的目录
name参数的作用,是为了确定程序所在的位置
Flask会默认创建静态路由
创建Flask程序的实例对象时,第一个参数名只能是字符串,不能使用数值,如果传入的字符串为python内置模块名,默认的静态路由是找不到的
app = Flask(__name__)
配置对象,可以导入具体配置文件
app.config.from_object(Config)
使用装饰器将路由映射到视图函数的index
@app.route('/n')
def index():
return 'hello word'
有时需要将同一类URL映射到同一个视图函数,
比如:使用同一个视图函数来显示不同用户的个人信息
路由传递的参数默认会当做字符串来处理,这里指定int类型,获取每个用户的id,尖括号中冒号后面的内容是动态的
@app.route('/user/<int:id>')
def user_info(id):
return 'hello itcast %s' % id
使用`abort函数`可以返回一个`http标准中存在的错误状态码`
如果在函数执行的过程中出现了异常可以使用abort`立即终止函数视图的执行
@app.route('/test/abort')
def test_about():
abort(404)
return 'hello itcast'
自定义转换器 内置转换器只可以限制数据类型不能限制数据的长度等,所以需要自定义转换器
class Refex(BaseConverter):
# regex = '[0-9]{4}'
def __init__(self, map, *args):
super(Refex, self).__init__(map)
self.regex = args[0]
print 'map',map
print '---', args[0]
添加转化器的映射
app.url_map.converters['re'] = Refex
@app.route('/<re("[0-9]{4}"):num>')
def demo_refex(num):
return '%s' % num
优化静态文件的访问路径
使用响应对象,make_response,current_app
把指定的文件发送给浏览器
自定义转换器,实现静态文件的优化
class Static_Path(BaseConverter):
def __init__(self,map,*args):
super(Static_Path, self).__init__(map)
self.regex = args[0]
添加转化器的映射
app.url_map.converters['static_path'] = Static_Path
定义路由访问静态页面
@app.route('/<static_path(".*"):filename>')
def StaticPate(filename):
if not filename:
filename = 'index.html'
else:
filename = 'html/' + filename
resp = make_response(current_app.send_static_file(filename))
return resp
状态保持:因为http是无状态的
,http使用的是tcp/ip协议
,每次连接都要创建socket连接,都要通过三次握手四次挥手,他并不会记住你上一次是不是访问过
web应用需要保持某种状态,cookie的本质是字典
设置cookie
@app.route('/setcookie')
def SetCookie():
resp = make_response('set cookies success')
resp.set_cookie('user','python23',max_age=300)
return resp
获取cookie
@app.route('/getcookie')
def GetCookie():
resp = request.cookies.get('user')
return resp
启动web服务器:
if __name__ == '__main__':
`查看视图函数中的路由映射`
print(app.url_map)
app.run()