一、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文件fromflaskimportFlaskapp = Flask(__name__)@app.route('/')defindex():return'Hello Flask'app.run()
运行
pythonhello.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中创建fromflaskimportBlueprint blue = Blueprint('first', __name__)# 在app/__init__.py中注册fromflaskimportFlaskfromApp.viewsimportbluedefcreateapp():app = Flask(__name__) app.register_blueprint(blueprint=blue)returnapp- 调用蓝图进行路由注册 @blue.route('/')defhello_world():return'Hello World!'- 创建app# 在manager.py中fromflask_scriptimportManagerfromAppimportcreateapp app = createapp() manager = Manager(app)if__name__ =='__main__': manager.run()
八、视图之路由
路由对应视图函数,并且可以接收参数。
参数分类
- 路径参数
位置参数
关键字参数
- 请求参数
get 参数在路径中?之后
post 参数在请求体中
参数语法
converter: var_name
参数类型converter
- string 字符串 接收的时候也是string,匹配到 / 的时候是匹配结束 例如: @blue.route('/getstudent//')defgetstudent(name): print(type(name))return'你的名字: %s'% name - path 路径 接收的时候也是string,而 / 只会当作字符串中的一个字符处理 - any 任意一个 指的是any中提供的任意一个,类似于SQL查询中的in例如: @blue.route('/getoption//')后面只能是A,B,C的其中一个 - uuid uuid格式 例如: @blue.route('/getuser//')# 获取uuidimport uuid @blue.route('/getuuid/')defget_uuid():returnstr(uuid.uuid4()) - int int格式 - float float格式
默认是string类型;
路由参数名和视图参数名必须一致!!
请求方式
-默认支持GET,HEAD,OPTIONS-如果想支持某一请求方式,需要自己手动指定 @blue.route('/requesttest/', methods=['POST','GET','PUT'])
反向解析
- 语法 url_for() url_for("蓝图名.函数名")- 例如# 反向解析@blue.route('/gethello/')defgethello():# 假设使用app就用app的名称;反之使用blue就用blue名称# 名称.函数名# blue = Blueprint('first', __name__)p = url_for('first.hello')returnp
反向解析即是可以获取对应的路径
九、视图之Request请求
服务器在接收到客户端请求后,会自动创建Request对象,由Flask自动创建,Request对象不可修改。
- request.method 请求方式- request.path 路由中的路径- request.args get请求参数的包装,args是一个ImmutableMultiDict对象,类字典结构对象 数据存储也是key-value 外层是大列表,列表中的元素是元组,元组中左边是key,右边是value- request.form 存储结构个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/')defget_response():return'带你装逼带你飞,带你走进垃圾堆!',403- 状态码 字符串形式直接将状态码添加到return的第二个参数 如果make形势,直接添加到make的第二个参数上# response响应[email protected]('/makeresponse/')defmake_resp(): resp = make_response('
我很帅!
',300)returnresp返回重定向
- redirect 重定向302- url_for 反向解析 @blue.route('/redirect/')defmake_redir():# 固定# return redirect('/makeresponse/')# 反向解析returnredirect(url_for('first.make_resp'))
抛出异常,终止程序执行
- abort状态码@blue.route('/makeabort/')defmake_abort():# 抛出异常(4xx 5xx)abort(404)return'睡着了?'
errorhandler
- 异常捕获- 可以根据状态或 Exception进行捕获- 函数中要包含一个参数,参数用来接收异常信息# 捕获404异常@blue.errorhandler(404)defhandler404(exception):return'
我是404我怕谁!!!
'十一、视图之会话技术
都是来解决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)returnrespon
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文件中fromflask_sessionimportSession 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)# 删除对应的值delxxx(key)# 删除当前所有的flushdb - session其他设置(flask-session同样适用) PERMANENT_SESSION_LIFETIME 设置超时时间 app.config['PERMANENT_SESSION_LIFETIME'] =60SESSION_COOKIE_NAME 设置会话cookie的名称 app.config['SESSION_COOKIE_NAME'] ='flask'
备注: 如果没有安装redis-server是启动不了的。安装操作: sudo apt install redis
作者:EndEvent
链接:https://www.jianshu.com/p/de3823b538d2
來源:
著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。