一、Flask简介
Flask是一个基于python实现的web开发"微"框架。
Flask和Django一样,也是一个基于MVC设计模式的web框架。
官方文档: http://flask.pocoo.org/docs/0.12/中文文档: http://docs.jinkan.org/docs/flask/
Flask依赖三个库: Jinja2模板引擎、Werkzeug WSGI工具集、Itsdangerous基于Django的签名模块
二、流行的Flask
# 流行的主要原因- 有非常齐全的官方文档,上手非常方便 - 有非常好的扩展机制和第三方扩展环境,工作中常见的软件都会有对应的扩展。自己动手实现扩展也是很容易的。 - 社区活跃度非常高 - 微型框架的形式给开发者更大的选择空间
三、HelloFlask
安装Flask
pip install flask
编辑文件
# 创建hello.py文件from flask import Flask app = Flask(__name__)@app.route('/')def index(): return 'Hello Flask'app.run()
运行
python hello.py
通过pycharm创建flask项目
四、项目启动参数配置
在启动时,可以在run()中添加参数
- debug是否开启调试模式,开启后修改python代码会自动重启- threaded是否开启多线程- port启动指定服务器端口号- host主机,默认是127.0.0.1,指定为0.0.0.0代表本机IP
app.run(debug=True, port=8000, host='0.0.0.0')
五、插件(扩展库)
flask-script插件(实现命令行参数接受)
- 安装插件 pip install flask-script - 调整代码 app = Flask(__name__) manager = Manager(app) - 修改启动方式 manager.run() - 命令启动项目(类似Django) python app.py runserver -r -d # 查看帮助文档,有哪些参数 python app.py runserver --help # 端口号 python app.py runserver -p 9000 # 调试模式 python app.py runserver -d # 自动重新加载 python app.py runserver -r # 主机 python app.py runserver -h '0.0.0.0'
插件: 帮助开发者,快速实现某种功能
插件使用流程: 下载安装、初始化配置
六、请求流程
请求流程
七、项目简单拆分(蓝图概念)
项目的简单拆分(类似Django结构)
简单拆分
注意: views.py直接写是不生效的,需要引入蓝图来解决这问题
蓝图概念
- 蓝图 宏观规划 - 蓝图是一种规划 主要用来规划urls(路由)
蓝图基本使用
- 安装 pip install flask-blueprint - 初始化蓝图 # views.py中创建 from flask import Blueprint blue = Blueprint('first', __name__) # 在app/__init__.py中注册 from flask import Flask from App.views import blue def createapp(): app = Flask(__name__) app.register_blueprint(blueprint=blue) return app - 调用蓝图进行路由注册 @blue.route('/') def hello_world(): return 'Hello World!' - 创建app # 在manager.py中 from flask_script import Manager from App import createapp app = createapp() manager = Manager(app) if __name__ == '__main__': manager.run()
八、视图之路由
路由对应视图函数,并且可以接收参数。
参数分类
- 路径参数 位置参数 关键字参数 - 请求参数 get 参数在路径中?之后 post 参数在请求体中
参数语法
converter: var_name
参数类型converter
- string 字符串 接收的时候也是string,匹配到 / 的时候是匹配结束 例如: @blue.route('/getstudent/<string:name>/') def getstudent(name): print(type(name)) return '你的名字: %s' % name - path 路径 接收的时候也是string,而 / 只会当作字符串中的一个字符处理 - any 任意一个 指的是any中提供的任意一个,类似于SQL查询中的 in 例如: @blue.route('/getoption/<any(A,B,C):op>/')后面只能是A,B,C的其中一个 - uuid uuid格式 例如: @blue.route('/getuser/<uuid:uu>/') # 获取uuid import uuid @blue.route('/getuuid/') def get_uuid(): return str(uuid.uuid4()) - int int格式 - float float格式
默认是string类型;
路由参数名和视图参数名必须一致!!
请求方式
- 默认支持GET,HEAD,OPTIONS- 如果想支持某一请求方式,需要自己手动指定 @blue.route('/requesttest/', methods=['POST','GET','PUT'])
反向解析
- 语法 url_for() url_for("蓝图名.函数名") - 例如# 反向解析@blue.route('/gethello/')def gethello(): # 假设使用app就用app的名称;反之使用blue就用blue名称 # 名称.函数名 # blue = Blueprint('first', __name__) p = url_for('first.hello') return p
反向解析即是可以获取对应的路径
九、视图之Request请求
服务器在接收到客户端请求后,会自动创建Request对象,由Flask自动创建,Request对象不可修改。
- request.method 请求方式 - request.path 路由中的路径 - request.args get请求参数 get请求参数的包装,args是一个ImmutableMultiDict对象,类字典结构对象 数据存储也是key-value 外层是大列表,列表中的元素是元组,元组中左边是key,右边是value - request.form post请求参数 存储结构个args一致 默认是接收post参数 还可以接收PUT,PATCH参数 - request.url 完整请求地址 - request.base_url 去掉GET参数的URL - request.remote_addr 请求的客户端地址 - request.file 上传的文件 - request.headers 请求头 - request.cookie 请求中的cookie ImmutableMultiDict类型 ImmutableMultiDict类似字典的数据结构 与字典的区别,可以存在相同的键 args、form、files都是ImmutableMultiDict的对象 ‘ ImmutableMultiDict数据获取方式 dict['uname'] dict.get('uname') # 推荐(在没有数据为空) dict.getlist('uname') # 获取指定key对应的所有值
request、session是内置对象(所有路由函数中都有)!
十、视图之Response响应
服务器返回给客户端的数据。
Response创建方式
- 直接返回字符串 - render_template 渲染模板,将模板转换成字符串 - make_response 创建一个响应,是一个真正的Response - Response()创建
Response由开发者创建
返回配置
- 内容 直接写,将内容传递过去 @blue.route('/response/') def get_response(): return '带你装逼带你飞,带你走进垃圾堆!',403- 状态码 字符串形式直接将状态码添加到return 的第二个参数 如果make形势,直接添加到make的第二个参数上 # response响应3 @blue.route('/makeresponse/') def make_resp(): resp = make_response('<h2>我很帅!</h2>',300) return resp
返回重定向
- redirect 重定向302- url_for 反向解析 @blue.route('/redirect/')def make_redir(): # 固定 # return redirect('/makeresponse/') # 反向解析 return redirect(url_for('first.make_resp'))
抛出异常,终止程序执行
- abort状态码 @blue.route('/makeabort/')def make_abort(): # 抛出异常(4xx 5xx) abort(404) return '睡着了?'
errorhandler
- 异常捕获 - 可以根据状态或 Exception进行捕获 - 函数中要包含一个参数,参数用来接收异常信息# 捕获404异常@blue.errorhandler(404)def handler404(exception): return '<h1> 我是404我怕谁!!! </h1>'
十一、视图之会话技术
都是来解决HTTP请求在网络开发中短链接的问题,HTTP是无状态的。
Cookie
- 客户端会话技术,浏览器的会话技术 - 数据全都是存储在客户端中 - 存储使用的键值对结构进行的存储(key-value) - Cookie是通过服务器创建的Response来创建的 - cookie特性 支持过期时间 默认会自动携带本网站的所有cookie 根据域名进行cookie存储 不能跨域名 不能跨浏览器 - 设置cookie respon = redirect(url_for('blue.index')) resp.set_cookie('username',username) - 获取cookie username = request.cookies.get('username','游客') - 删除cookie resp = redirect(url_for('blue.user_index')) resp.delete_cookie() 备注: # 模板转为字符串 tempstr = render_template('about.html', username=uu) # 模板字符串作为 响应对象 参数 respon = make_response(tempstr) return respon
Cookie交互流程
Session
- 服务端的会话技术 - 所有数据存储在服务器中 - 默认存储在内存中 django默认做了数据持久化(存在了数据库中) - 存储结构也是key-value形式,键值对(其实就是字典) - session 是离不开cookie的 - 设置session session['username'] = username - 获取session username = session.get('username','游客') - 删除session # 方式一: session是存在cookie中的 resp.delete_cookie('session') # 方式二: 直接删除session中对应数据 session.pop('username')
session交互流程
要使用session还需要秘钥种子SECRET_KEY,在app初始化添加进去即可(app.config['SECRET_KEY'] = '1231231eqwedfaefdf');
Token
- 手动实现的session - 如果在web开发中没有cookie,那么token也是不能使用的 - 脱离web前端,Token是可以使用的 传输给客户端,客户端保存 在请求的时候,将token值再传输回来
十二、session之持久化存储
flask中这些插件几乎并没有干扰到之前的任何逻辑,使用起来非常的方便,就类似于中间件。
flask中session默认存储在内存中; django中做了持久化,存储在数据库(可以修改到redis中); flask中没有对默认session进行任何处理; flask-session 可以实现session的数据持久化; redis(缓存在磁盘上的时候,管理磁盘文件使用lru, 最近最少使用); - flask-session安装 pip install flask-session - 需要安装redis pip install redis - flask-session的配置(初始化完成后,使用和之前session使用一致) # app/__init__.py文件中 from flask_session import Session app.config['SECRET_KEY'] = '123qdqwe123113' # 秘钥 app.config['SESSION_TYPE'] = 'redis' # 配置 sess = Session() # 实例化session对象 sess.init_app(app) # session对象初始化 # 简化操作: sess = Session(app)- redis连接问题(需要启动) redis-server - redis查看值 # 进入到redis命令行 redis-cli # 查看所有的 keys * # 获取对应的值 get xxxx(key) # 获取时间(session的生命周期,默认31天) ttl xxx(key) # 删除对应的值 del xxx(key) # 删除当前所有的 flushdb - session其他设置(flask-session同样适用) PERMANENT_SESSION_LIFETIME 设置超时时间 app.config['PERMANENT_SESSION_LIFETIME'] = 60 SESSION_COOKIE_NAME 设置会话cookie的名称 app.config['SESSION_COOKIE_NAME'] = 'flask'
作者:EndEvent
链接:https://www.jianshu.com/p/de3823b538d2