01-Flask之基本流程
2018-07-07 本文已影响516人
EndEvent
一、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请求参数的包装,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/')
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'
备注: 如果没有安装redis-server是启动不了的。安装操作: sudo apt install redis