美文网首页
Flask之基本流程

Flask之基本流程

作者: 仙灵儿 | 来源:发表于2018-07-21 22:58 被阅读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

    來源:简书

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

    相关文章

      网友评论

          本文标题:Flask之基本流程

          本文链接:https://www.haomeiwen.com/subject/rendpftx.html