Flask开发接口
Posted 进击的大乐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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. 查询数据
以上是关于Flask开发接口的主要内容,如果未能解决你的问题,请参考以下文章