一:Flask的基本介绍和小案例
01:flask的基本介绍
Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架。 Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login,数据库Flask-SQLAlchemy),都需要用第三方的扩展来实现。比如可以用 Flask 扩展加入ORM、窗体验证工具,文件上传、身份验证等。Flask 没有默认使用的数据库,你可以选择 MySQL,也可以用 NoSQL。 其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是 Flask 框架的核心。 官网: http://flask.pocoo.org/ 官方文档: <http://docs.jinkan.org/docs/flask/> **Flask常用扩展包:** - Flask-SQLalchemy:操作数据库,ORM; - Flask-script:插入脚本; - Flask-migrate:管理迁移数据库; - Flask-Session:Session存储方式指定; - Flask-WTF:表单; - Flask-Mail:邮件; - Flask-Bable:提供国际化和本地化支持,翻译; - Flask-Login:认证用户状态; - Flask-OpenID:认证; - Flask-RESTful:开发REST API的工具; - Flask JSON-RPC: 开发rpc远程服务[过程]调用 - Flask-Bootstrap:集成前端Twitter Bootstrap框架 - Flask-Moment:本地化日期和时间 - Flask-Admin:简单而可扩展的管理接口的框架 可以通过 http://flask.pocoo.org/extensions/ 查看更多flask官方推荐的扩展
02:安装flask
1.准备虚拟环境
mkvirtualenv flask_demo -p python3
2:安装flask
pip install flask==0.12.4
03:创建flask项目
与django不同,flask不会提供任何的自动操作,所以需要手动创建项目目录,需要手动创建启动项目的管理文件
例如,创建项目目录 flaskdemo,在目录中创建manage.py.在pycharm中打开项目并指定上面创建的虚拟环境
小案例:
from flask import Flask app=Flask(__name__) @app.route('/') ## 也可自定义指定访问路径为 @app.route('/demo1') def index(): return 'hello world !' if __name__=='__main__': app.run()
代码分析:
# 导入Flask类 from flask import Flask """ import_name Flask程序所在的包(模块),传 __name__ 就可以 其可以决定 Flask 在访问静态文件时查找的路径 static_path 静态文件访问路径(不推荐使用,使用 static_url_path 代替) static_url_path 静态文件访问路径,可以不传,默认为:/ + static_folder static_folder 静态文件存储的文件夹,可以不传,默认为 static template_folder 模板文件存储的文件夹,可以不传,默认为 templates """ app = Flask(__name__) # 加载项目配置 # 配置类 class Config(object): DEBUG = True app.config.from_object( Config ) # 指定服务器IP和端口 app.run(host="0.0.0.0", port=5000, debug = True)
04:flask路由传递参数
1:# 路由传递参数[没有限定类型]
from flask import Flask app=Flask(__name__) # 路由传递参数[没有限定类型] @app.route('/home/<user_id>') def home(user_id): return 'home page,%s'%user_id if __name__=='__main__': app.run()
实现方法:
2:# 路由传递参数[限定类型]
from flask import Flask app=Flask(__name__) @app.route('/test/<int:user_id>') def test_info(user_id): return "hello %d "% user_id if __name__=='__main__': app.run()
实现方法:
ps:传递多个参数
# 一个路由中可以接受多个路由参数,并且路由转换器也可以使用多个 @app.route("/user/<re('d{3}'):user_id>/avatar/<re('w{4,8}'):avatar_id>",methods=["get"]) def user2(user_id,avatar_id): print(request.method) return "用户%s,头像id:%s" % (user_id,avatar_id)
05:路由限定请求方式.需要导入flask的request模块
案例:
from flask import Flask,request #倒入路由 from settings.dev import DevConfig app=Flask(__name__) #注册app @app .route('/test_re',methods=["GET","POST"]) #限定请求方式 def test_limit(): return request.method # if __name__=='__main__': app.run()
案例结果:
二:正则匹配路由
01:正则匹配的路由的实现步骤
在 web 开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,根据自己的规则去限定请求参数再进行访问 具体实现步骤为: - 导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录 - 自定义转换器:自定义类继承于转换器基类 - 添加转换器到默认的转换器字典中 - 使用自定义转换器实现自定义匹配规则
02:代码实现
1:导入转换器基类
from werkzeug.routing import BaseConverter
2:自定义转换器
# 自定义正则转换器 class RegexConverter(BaseConverter): def __init__(self, url_map, *args): super(RegexConverter, self).__init__(url_map) # 将接受的第1个参数当作匹配规则进行保存 self.regex = args[0]
3:添加转换器到默认的转换器字典中,并指定转换器使用时名字为: re
app = Flask(__name__) # 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: re app.url_map.converters['re'] = RegexConverter
4:使用转换器去实现自定义匹配规则
ps“当前此处定义的规则是:3位数字
@app.route('/user/<re("[0-9]{3}"):user_id>') def user_info(user_id): return "user_id 为 %s" % user_id
5:运行
运行测试:<http://127.0.0.1:5000/user/123> ,如果访问的url不符合规则,会提示找不到页面
完整的正则路由案例:
from flask import Flask, request from werkzeug.routing import BaseConverter # 第一步:倒入转换基类 app = Flask(__name__) # 第二步:自定义转换器 class RegexConverter(BaseConverter): def __init__(self, url_map, *args): super(RegexConverter, self).__init__(url_map) self.regex = args[0] # 第三步:将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: re app.url_map.converters['re'] = RegexConverter # 第四步:使用转换器去实现自定义匹配规则 # @app.route('/user/<re("[0-9]{3}"):user_id>') @app.route("/user/<re('d{3}'):user_id>",methods=["get"]) def user_info(user_id): return "user_id为%s" % user_id if __name__ == '__main__': app.run()
运行结果:
匹配结果:
不匹配的结果:
03:系统自带转换器
DEFAULT_CONVERTERS = { 'default': UnicodeConverter, 'path': PathConverter, 'string': UnicodeConverter, 'any': AnyConverter, 'int': IntegerConverter, 'float': FloatConverter, 'uuid': UUIDConverter, }
系统自带的转换器具体使用方式在每种转换器的注释代码中有写,请留意每种转换器初始化的参数。
04:http的请求和响应
01:请求
文档: http://docs.jinkan.org/docs/flask/api.html#flask.request - **request**:flask中代表当前请求的 `request 对象` - **作用**:在视图函数中取出本次请求数据 - **导入**:``from flask import request``
常用的属性如下:
02:获取请求中查询字符串
from flask import Flask, request from settings.dev import DevConfig app = Flask(__name__) app.config.from_object(DevConfig) # http://127.0.0.1:5000/?username=Tom&lve=1&lve=2&lve=3 @app.route('/test03/', methods=["GET", "POST"]) #test03 后面的 / 必须要写 不然会报错 def user_info(): # 获取单个查询字符串参数 username=request.args.get("username") print("===",username) # # 获取所有查询字符串参数, 获取请求地址中的查询字符串并转换为字典格式 parmas=request.args.to_dict() print(">>>",parmas) # lst=request.args.getlist("lve") print("----",lst) return "hello %s" % username if __name__ == '__main__': app.run()
打印结果:
=== Tom
>>> {'username': 'Tom', 'lve': '1'}
---- ['1', '2', '3']
报错点:
@app.route('/test03/', methods=["GET", "POST"]) #test03 后面的 / 必须要写 不然会报错