Flask之基本流程

2018-07-21  本文已影响36人  仙灵儿

一、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响应3@blue.route('/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

來源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

上一篇下一篇

猜你喜欢

热点阅读