01-Flask之基本流程

一、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'

插件: 帮助开发者,快速实现某种功能

插件使用流程: 下载安装、初始化配置

六、请求流程

《01-Flask之基本流程》 请求流程

七、项目简单拆分(蓝图概念)

  • 项目的简单拆分(类似Django结构)

    《01-Flask之基本流程》 简单拆分

注意: 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

《01-Flask之基本流程》 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')

《01-Flask之基本流程》 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

    原文作者:EndEvent
    原文地址: https://www.jianshu.com/p/de3823b538d2
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞