zoukankan      html  css  js  c++  java
  • Flask开发接口(二)

    Flask开发接口

    在之前那篇直接操作数据库的基础上作出的改进,这个版本可能更加适合项目中的使用,同样实现俩个功能,增加和查询功能,基本机构如下:

    操作步骤:

    1.在app下,新建一个 __init__.py文件,这里是项目结构,在蓝本中定义路由地址

    # coding=utf-8
    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    from config import config
    
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    
    
    db = SQLAlchemy()
    
    def create_app(config_name):
        app = Flask(__name__)
        app.config.from_object(config[config_name])
        config[config_name].init_app(app)
    
        db.init_app(app)
    
    
        from .api_1_0 import api as api_1_0_blueprint
        app.register_blueprint(api_1_0_blueprint,url_prefix='/api/v1.0')
    
        return app

    2.新建一个models.py,这里面是数据结构

     

    # coding=utf-8
    from datetime import datetime
    from . import db
    from app.exception import ValidationError
    from flask import url_for
    
    
    class Post(db.Model):
        __tablename__='posts'
        id = db.Column(db.Integer,primary_key=True)
        body = db.Column(db.Text)
        timestamp = db.Column(db.DateTime,index=True,default=datetime.utcnow)
    
    # 所有 url_for() 方法都指定了参数 _external=True,
    # 这么做是为了生成完整的 URL,而不是生成传统 Web 程序中经常使用的
    # 相对 URL。
        def to_json(self):
            json_post = {
                'url':url_for('api.get_post',id=self.id,_external=True),
                'body':self.body,
                'timestamp':self.timestamp
            }
            return json_post
    
    # 因为id,和timestamp都是自动生成的,所以只需要传body的值即可
        @staticmethod
        def from_json(json_post):
            body = json_post.get('body')
            if body is None or body =='':
                raise ValidationError(u'文章内容不能为空')
            return Post(body=body)

    3. 新建一个api_1_0的文件夹,同时在文件夹下新建一个__init__.py的文件,这是api蓝本的构造文件

    from flask import Blueprint
    
    api = Blueprint('api',__name__)
    
    from . import posts

    4.      错误信息errors.py的定义,其中需要引用exception.py中定义的错误处理的调用

    # coding=utf-8
    from flask import jsonify
    from . import api
    from app.exception import  ValidationError
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    
    
    
    def bad_request(message):
        response = jsonify({'错误':'请求错误','信息':message})
        response.status_code = 400
        return response
    
    
    # 程序需要向客户端提供适当的响应以处理这个异常。为了避免在视图函数中编写捕
    # 获异常的代码, 我们可创建一个全局异常处理程序。
    @api.errorhandler(ValidationError)
    def validation_error(e):
        return bad_request(e.args[0])

    5.      posts.py接口业务逻辑,查询与请求

    # coding=utf-8
    from flask import jsonify, request, g, url_for
    
    from app.models import Post
    from . import api
    from .. import db
    
    
    
    # 获取文章资源GET请求
    @api.route('/posts/<int:id>')
    def get_post(id):
        post = Post.query.get_or_404(id)
        return jsonify(post.to_json())
    
    
    # 文章资源POST 插入请求
    @api.route('/posts', methods=['POST'])
    def new_post():
        post = Post.from_json(request.json)
        db.session.add(post)
        db.session.commit()
        return jsonify(post.to_json()), 201,{'Location': url_for('api.get_post', id=post.id, _external=True)}

    6.    在更目录下增加项目的配置文件config.py

    # coding=utf-8
    import os
    basedir = os.path.abspath(os.path.dirname(__file__))
    
    class Config:
    
        @staticmethod
        def init_app(app):
            pass
    
    
    class DevelopmentConfig(Config):
        DEBUG = True
        SQLALCHEMY_DATABASE_URI = 'sqlite:///D://py//flask-api//data-dev.sqlite'
    
    
    
    config = {
        'development': DevelopmentConfig,
        'default': DevelopmentConfig
    }

    7.       最后修改manage.py文件,这是项目的启动文件

     

     

     

    # coding=utf-8
    import os
    from app import create_app, db
    from app.models import Post
    from flask_script import Manager, Shell
    from flask_migrate import Migrate, MigrateCommand
    
    app = create_app(os.getenv('FLASK_CONFIG') or 'default')
    manager = Manager(app)
    migrate = Migrate(app, db)
    
    def make_shell_context():
        return dict(app=app, db=db, Post=Post)
    
    manager.add_command("shell", Shell(make_context=make_shell_context))
    manager.add_command('db', MigrateCommand)
    
    
    @app.route('/')
    def hello():
        return 'hello'
    
    
    if __name__ == '__main__':
        manager.run()

    编程完成之后,可以使用flask-migrate实现数据的迁移,需要执行:

    1.       python manage.py db init  --这个命令会创建migrations文件夹

    2.       python manage.py db migrate –m “initial migration” ----migrate子命令用来创建迁移脚本

    3.       python manage.py db upgrade   ---这个命令能把改动应用到数据库中

     

    执行完上述三条命令之后,会生成data-dev.sqlite这个数据库,现在可以通过使用postman这个工具来请求接口了

     

    1.       新增数据

    2.  查询数据

     

     

     

     

     

     

     

     

  • 相关阅读:
    Django连接MySQL(二)
    Django框架,python2和python3共存的情况下,创建Django项目
    pycharm破解
    dbutils中实现数据的增删改查的方法,反射常用的方法,绝对路径的写法(杂记)
    Spring中的事物管理,基于spring的bean的配置
    Spring中的事物管理,用 @Transactional 注解声明式地管理事务
    Ajax中GET和POST的区别
    Spring对 JDBC 的支持,JdbcTemplate类的使用
    Spring AOP:面向切面编程,AspectJ,是基于spring 的xml文件的方法
    Spring AOP:面向切面编程,AspectJ,是基于注解的方法
  • 原文地址:https://www.cnblogs.com/jinjidedale/p/6774266.html
Copyright © 2011-2022 走看看