python3-Flask实现Api接口

引言:

Flask 是一个微型的 Python 开发的 Web 框架,基于Werkzeug WSGI工具箱和Jinja2 模板引擎。 Flask也被称为“microframework”,因为它使用简单的核心,用extension增加其他功能。Flask没有默认使用的数据库、窗体验证工具。然而,Flask支持功能扩展,可以更加自己的需求还扩展所需的模块。相较于Django,更加轻量,灵活,可定制化高,更适用于小型项目开发。

一 . 环境准备

版本:python3

开发工具:Pycharm

二 . 项目Demo步骤

  1. 创建demo项目

    由于使用的Pycharm开发,在创建项目时,会自动生成python运行的虚拟环境 venv
    python3-Flask实现Api接口_第1张图片

  2. 运行项目

    新建好的项目主要由4个文件夹构成:static,templates,venv,app.py

    python3-Flask实现Api接口_第2张图片

    打开app.py 点击run直接启动,浏览器打开 http://127.0.0.1:5000/ 可看到 Hello World! ,即成功创建基本的Flask项目。

    python3-Flask实现Api接口_第3张图片

  3. 创建项目目录

    根据我们的需求,需要重新整理一下项目目录及文件,删除static,templates目录和 app.py文件

    创建如下目录文件:

    ​ (1) app文件夹为业务代码的存放处,包括视图+模型+静态文件,也叫做应用包。

    ​ (2) config.py 和 manage.py是启动应用和配置应用的关键。

    ​ (3) requirements.txt 里面存放当前环境使用到的库,当我们将项目迁移到别的服务器(环境)时,可以通过这个文件,快速导入依赖的所有库。

    pip3 freeze -l > requirements.txt  #导出
    pip3 install -r requirements.txt   #导入
    

    python3-Flask实现Api接口_第4张图片

  4. 代码编写
    (1) manage.py

    每个flask项目都必须有一个应用实例,新创建的项目的app.py里面可以看到 app = Flask(__name__),app 便是应用实例,而这里的app是在app模块的__init__.py中创建,这样做,可以动态修改配置,给脚本配置应用“留出时间”,还能够创建多个应用,单元测试时也很有用。

    # 启动程序
    from app import create_app
    
    """
    development:    开发环境
    production:     生产环境
    testing:        测试环境
    default:        默认环境
    
    """
    # 通过传入当前的开发环境,创建应用实例,不同的开发环境配置有不同的config。这个参数也可以从环境变量中获取
    app = create_app('development')
    
    if __name__ == '__main__':
        # flask内部自带的web服务器,只可以在测试时使用
        # 应用启动后,在9001端口监听所有地址的请求,同时根据配置文件中的DEBUG字段,设置flask是否开启debug
        app.run(host='0.0.0.0', port=9001, debug=app.config['DEBUG'])
    
    (2) app模块中的__init__.py

    这里主要是根据传入的环境名来创建应用实例对象和注册蓝图

    from flask import Flask
    from config import config
    
    def create_app(config_name):
    
        # 初始化
        app = Flask(__name__)
        
        # 导致指定的配置对象:创建app时,传入环境的名称
        app.config.from_object(config[config_name])
       	 
        # 注册所有蓝图
        regist_blueprints(app)
        
        return app
    
    def regist_blueprints(app):
    
        # 导入蓝图对象
        # 方式一
        from app.api import api
        
        # 方式二:这样,就不用在app/api/__init__.py(创建蓝本时)里面的最下方单独引入各个视图模块了
        # from app.api.views import api
        # from app.api.errors import api
        
        # 注册api蓝图,url_prefix为所有路由默认加上的前缀
        app.register_blueprint(api, url_prefix='/api')
    
    (3) 配置文件 config.py

    这里主要是管理项目的配置,如:数据库,redis,或一些常量,根据不同环境进行配置

    # 配置环境的基类
    class Config(object):
    
        # 每次请求结束后,自动提交数据库中的变动,该字段在flask-sqlalchemy 2.0之后已经被删除了(有bug)
        SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    
        # 2.0之后新加字段,flask-sqlalchemy 将会追踪对象的修改并且发送信号。
        # 这需要额外的内存,如果不必要的可以禁用它。
        # 注意,如果不手动赋值,可能在服务器控制台出现警告
        SQLALCHEMY_TRACK_MODIFICATIONS = False
    
        # 数据库操作时是否显示原始SQL语句,一般都是打开的,因为后台要日志
        SQLALCHEMY_ECHO = True
    
    
    # 开发环境的配置
    class DevelopmentConfig(Config):
        """
        配置文件中的所有的账号密码等敏感信息,应该避免出现在代码中,可以采用从环境变量中引用的方式,比如:
        username = os.environ.get('MYSQL_USER_NAME')
        password = os.environ.get('MYSQL_USER_PASSWORD')
        本文为了便于理解,将用户信息直接写入了代码里
        """
        DEBUG = True
        # 数据库URI
        # SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:xxx@xxxx/xxx'
    
        # 也可如下来写,比较清晰
        # SQLALCHEMY_DATABASE_URI = "mysql+pymysql://{username}:{password}@{hostname}/{databasename}".format(username="xxxx", password="xxxx", hostname="xxxx", databasename="xxxx")
    
    
    # 测试环境的配置
    class TestingConfig(Config):
    
        TESTING = True
        SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:[email protected]:3306/cleven_test'
    
    
        """
        测试环境也可以使用sqlite,默认指定为一个内存中的数据库,因为测试运行结束后无需保留任何数据
        也可使用  'sqlite://' + os.path.join(basedir, 'data.sqlite') ,指定完整默认数据库路径
        """
        # import os
        # basedir = os.path.abspath(os.path.dirname(__file__))
        # SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URL') or 'sqlite://'
    
    
    # 生产环境的配置
    class ProductionConfig(Config):
    
        # SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:xxx@xxxx:3306/xxxx'
    
    
    # 初始化app实例时对应的开发环境声明
    config = {
        'development': DevelopmentConfig,
        'production': ProductionConfig,
        'testing': TestingConfig,
        'default': DevelopmentConfig
    }
    
    (4) api蓝本模块中的 __init__.py
    from flask import Blueprint
    
    # 两个参数分别指定蓝本的名字、蓝本所在的包或模块
    api = Blueprint('api', __name__)
    
    """
     导入路由模块、错误处理模块,将其和蓝本关联起来
    
     1、应用的路由保存在包里的 views.py 模块中
     2、导入这两个模块就能把路由与蓝本关联起来
     3、注意,这些模块在 app/__init__.py 脚本的末尾导入,原因是:
        为了避免循环导入依赖,因为在 app/views.py 中还要导入api蓝本,所以除非循环引用出现在定义 api 之后,否则会致使导入出错。
    
    """
    from app.api import views
    
    (5) 业务核心视图 view.py

    这里主要处理外部请求以及返回处理结果

    from flask import make_response, jsonify, request
    from app.api import api
    
    @api.route('/v1.0/test/', methods=['GET', 'POST'])
    def test():
        """
         上面 /v1.0/test/ 定义的url最后带上"/":
         1、如果接收到的请求url没有带"/",则会自动补上,同时响应视图函数
         2、如果/v1.0/test/这条路由的结尾没有带"/",则接收到的请求里也不能以"/"结尾,否则无法响应
        """
        # 获取参数
        #if request.method == "POST":
        		 # 获取表单参数
        #    username = request.form.get("username")
        #    password = request.form.get("password")
        		 # 获取json参数
        #    data = request.get_json()
        #else:
        		 #获取get参数
        #    username = request.args.get("username")
        #    password = request.args.get("password")
        data = {'username': 'xxx', 'password': 'xxxx'}
        response = jsonify(code=200,
                           msg="success",
                           data=data)
        return response
        # 也可以使用 make_response 生成指定状态码的响应
        # return make_response(response, 200)
    

三 . 运行测试

​ 打开manage.py,运行即可。使用postman测试 http://127.0.0.1/api/v1.0/test/ 即可看到返回值。

总结:

​ 由此便实现了一个基于flask的简单api项目,但是没有包含数据库,服务器分发以及uWSGI部署等等一些功能,后续会继续实现数据库连接,部署等功能。

你可能感兴趣的:(flask,python,flask,api)