• flask总结01


    一:Flask的基本介绍和小案例

    01:flask的基本介绍

      
    Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架。
    
    Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login,数据库Flask-SQLAlchemy),都需要用第三方的扩展来实现。比如可以用 Flask 扩展加入ORM、窗体验证工具,文件上传、身份验证等。Flask 没有默认使用的数据库,你可以选择 MySQL,也可以用 NoSQL。
    
    其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是 Flask 框架的核心。
    
    官网: http://flask.pocoo.org/
    
    官方文档: <http://docs.jinkan.org/docs/flask/>
    
    **Flask常用扩展包:**
    
    - Flask-SQLalchemy:操作数据库,ORM;
    - Flask-script:插入脚本;
    - Flask-migrate:管理迁移数据库;
    - Flask-Session:Session存储方式指定;
    - Flask-WTF:表单;
    - Flask-Mail:邮件;
    - Flask-Bable:提供国际化和本地化支持,翻译;
    - Flask-Login:认证用户状态;
    - Flask-OpenID:认证;
    - Flask-RESTful:开发REST API的工具;
    - Flask JSON-RPC:  开发rpc远程服务[过程]调用
    - Flask-Bootstrap:集成前端Twitter Bootstrap框架
    - Flask-Moment:本地化日期和时间
    - Flask-Admin:简单而可扩展的管理接口的框架
    
    可以通过  http://flask.pocoo.org/extensions/ 查看更多flask官方推荐的扩展
    View Code

    02:安装flask

    1.准备虚拟环境

    mkvirtualenv flask_demo -p python3

    2:安装flask

    pip install flask==0.12.4

    03:创建flask项目

    与django不同,flask不会提供任何的自动操作,所以需要手动创建项目目录,需要手动创建启动项目的管理文件
    例如,创建项目目录 flaskdemo,在目录中创建manage.py.在pycharm中打开项目并指定上面创建的虚拟环境

    小案例:

    from flask import Flask
    app=Flask(__name__)
    
    @app.route('/')  ## 也可自定义指定访问路径为 @app.route('/demo1')
    def index():
        return 'hello world !'
    
    if __name__=='__main__':
        app.run()

    代码分析:

      
    # 导入Flask类
    from flask import Flask
    
    """
    import_name      Flask程序所在的包(模块),传 __name__ 就可以
                     其可以决定 Flask 在访问静态文件时查找的路径
    static_path      静态文件访问路径(不推荐使用,使用 static_url_path 代替)
    static_url_path  静态文件访问路径,可以不传,默认为:/ + static_folder
    static_folder    静态文件存储的文件夹,可以不传,默认为 static
    template_folder  模板文件存储的文件夹,可以不传,默认为 templates
    """
    app = Flask(__name__)
    
    
    
    # 加载项目配置
    # 配置类
    class Config(object):
        DEBUG = True
    
    
    app.config.from_object( Config )
    
    
    # 指定服务器IP和端口
    app.run(host="0.0.0.0", port=5000, debug = True)
    View Code

    04:flask路由传递参数

    1:# 路由传递参数[没有限定类型]

    from flask import Flask
    app=Flask(__name__)
    
    
    # 路由传递参数[没有限定类型]
    @app.route('/home/<user_id>')
    def home(user_id):
        return 'home page,%s'%user_id
    
    
    if __name__=='__main__':
        app.run()

    实现方法:

    2:# 路由传递参数[限定类型]

    from flask import Flask
    app=Flask(__name__)
    
    
    @app.route('/test/<int:user_id>')
    def test_info(user_id):
        return "hello %d "% user_id
    
    
    if __name__=='__main__':
        app.run()

    实现方法:

    ps:传递多个参数

    # 一个路由中可以接受多个路由参数,并且路由转换器也可以使用多个
    @app.route("/user/<re('d{3}'):user_id>/avatar/<re('w{4,8}'):avatar_id>",methods=["get"])
    def user2(user_id,avatar_id):
        print(request.method)
        return "用户%s,头像id:%s" % (user_id,avatar_id)

    05:路由限定请求方式.需要导入flask的request模块

    案例:

    from flask import Flask,request   #倒入路由
    from settings.dev import DevConfig
    
    app=Flask(__name__)   #注册app
    
    
    @app .route('/test_re',methods=["GET","POST"])  #限定请求方式
    def test_limit():
    
        return request.method   #
    
    if __name__=='__main__':
        app.run()

    案例结果:

    二:正则匹配路由

    01:正则匹配的路由的实现步骤

    在 web 开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,根据自己的规则去限定请求参数再进行访问
    
    具体实现步骤为:
    
    - 导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录
    - 自定义转换器:自定义类继承于转换器基类
    - 添加转换器到默认的转换器字典中
    - 使用自定义转换器实现自定义匹配规则

    02:代码实现

    1:导入转换器基类

    from werkzeug.routing import BaseConverter

    2:自定义转换器

    # 自定义正则转换器
    class RegexConverter(BaseConverter):
        def __init__(self, url_map, *args):
            super(RegexConverter, self).__init__(url_map)
            # 将接受的第1个参数当作匹配规则进行保存
            self.regex = args[0]

    3:添加转换器到默认的转换器字典中,并指定转换器使用时名字为: re

    app = Flask(__name__)
    
    # 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: re
    app.url_map.converters['re'] = RegexConverter

    4:使用转换器去实现自定义匹配规则

      ps“当前此处定义的规则是:3位数字

    @app.route('/user/<re("[0-9]{3}"):user_id>')
    def user_info(user_id):
        return "user_id 为 %s" % user_id

    5:运行

    运行测试:<http://127.0.0.1:5000/user/123> ,如果访问的url不符合规则,会提示找不到页面

    完整的正则路由案例:

    from flask import Flask, request
    from werkzeug.routing import BaseConverter  # 第一步:倒入转换基类
    
    app = Flask(__name__)
    # 第二步:自定义转换器
    class RegexConverter(BaseConverter):
        def __init__(self, url_map, *args):
            super(RegexConverter, self).__init__(url_map)
            self.regex = args[0]
    # 第三步:将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: re
    app.url_map.converters['re'] = RegexConverter
    
    # 第四步:使用转换器去实现自定义匹配规则
    # @app.route('/user/<re("[0-9]{3}"):user_id>')
    @app.route("/user/<re('d{3}'):user_id>",methods=["get"])
    def user_info(user_id):
        return "user_id为%s" % user_id
    
    
    if __name__ == '__main__':
        app.run()
    正则路由案例

    运行结果:

    匹配结果:

     不匹配的结果:

     

    03:系统自带转换器

    DEFAULT_CONVERTERS = {
        'default':          UnicodeConverter,
        'path':             PathConverter,
        'string':           UnicodeConverter,
        'any':              AnyConverter,
        'int':              IntegerConverter,
        'float':            FloatConverter,
        'uuid':             UUIDConverter,
    }

    系统自带的转换器具体使用方式在每种转换器的注释代码中有写,请留意每种转换器初始化的参数。

    04:http的请求和响应

      01:请求

    文档: http://docs.jinkan.org/docs/flask/api.html#flask.request
    
    - **request**:flask中代表当前请求的 `request 对象`
    - **作用**:在视图函数中取出本次请求数据
    - **导入**:``from flask import request``

    常用的属性如下:

    02:获取请求中查询字符串

    from flask import Flask, request
    from settings.dev import DevConfig
    
    app = Flask(__name__)
    app.config.from_object(DevConfig)
    
    # http://127.0.0.1:5000/?username=Tom&lve=1&lve=2&lve=3
    @app.route('/test03/', methods=["GET", "POST"])   #test03  后面的  /  必须要写  不然会报错
    def user_info():
        # 获取单个查询字符串参数
        username=request.args.get("username")
        print("===",username)
    
        # # 获取所有查询字符串参数, 获取请求地址中的查询字符串并转换为字典格式
        parmas=request.args.to_dict()
        print(">>>",parmas)
        #
        lst=request.args.getlist("lve")
        print("----",lst)
    
        return "hello %s" % username
    
    
    if __name__ == '__main__':
        app.run()

    打印结果:
    === Tom
    >>> {'username': 'Tom', 'lve': '1'}
    ---- ['1', '2', '3']

    报错点:

    @app.route('/test03/', methods=["GET", "POST"])   #test03  后面的  /  必须要写  不然会报错
  • 相关阅读:
    六种排序
    洛谷 P1879 [USACO06NOV]玉米田Corn Fields
    [USACO06NOV]玉米田Corn Fields
    c++位运算符 | & ^ ~ && ||,补码,反码
    Blockade(Bzoj1123)
    割点(Tarjan算法)【转载】
    子串
    生命是什么
    怎样说话才打动人
    自控力
  • 原文地址:https://www.cnblogs.com/one-tom/p/10671506.html
Copyright © 2020-2023  润新知