前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flask RESTful API 简单的设计一个 GET 请求接口

Flask RESTful API 简单的设计一个 GET 请求接口

作者头像
禹都一只猫olei
发布2018-07-05 11:07:22
6.1K3
发布2018-07-05 11:07:22
举报

  • 数据库:PostgreSQL
  • 框架:Flask
  • 语言:Python 3.6

前提

  • 之前我有每天定时爬取bing壁纸,写入postgresql数据库的,如下:
Flask RESTful API 简单的设计一个 GET 请求接口
Flask RESTful API 简单的设计一个 GET 请求接口
  • ER图
Flask RESTful API 简单的设计一个 GET 请求接口
Flask RESTful API 简单的设计一个 GET 请求接口

需要的Python环境

  • flask-sqlalchemy
  • flask-migrate
  • flask-script
  • flask-restful
  • flask
  • psycopg2

创建配置文件Config.py

里面设置数据库的引擎以及其它的一些需要配置的程序参数

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 18/6/25 下午5:15
# @Author  : olei
# @File    : Config.py
# @Software: PyCharm
# @license : Copyright(C), olei.me
# @Contact : i@olei.me

DB_USER = "postgres"
DB_PASSWORD = "postgres"
HOST = "127.0.0.1"
DB_NAME = "bing"


DEBUG = True

SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_DATABASE_URI = 'postgresql://' + DB_USER + ':' + DB_PASSWORD + "@" + HOST + '/' + DB_NAME

这里设置的是postgresql的配置项

数据模型Model.py

根据数据库,来设置数据模型

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 18/6/25 下午5:22
# @Author  : olei
# @File    : Model.py
# @Software: PyCharm
# @license : Copyright(C), olei.me
# @Contact : i@olei.me

from flask_sqlalchemy import SQLAlchemy


db = SQLAlchemy()

class Bing(db.Model):
    __tablename__ = "psql_bing"
    id = db.Column(db.Integer,unique=True,primary_key=True)
    dates = db.Column(db.Date,nullable=False)
    bing_url = db.Column(db.String(10000),nullable=False)
    qiniu_url = db.Column(db.String(10000),nullable=False)
    image_name = db.Column(db.String(10000),nullable=False)

忽略我给的String的大小...,这个与flask中设计表结构的写法是一致的,用到flask的flask-sqlalchemy

数据库迁移文件migrate.py

使用Flask-Migrate和Flask-Script来实现数据迁移

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 18/6/25 下午5:25
# @Author  : olei
# @File    : migrate.py
# @Software: PyCharm
# @license : Copyright(C), olei.me
# @Contact : i@olei.me

from flask import Flask
from flask_migrate import Migrate,MigrateCommand
from flask_script import Manager
from Model import db

app = Flask(__name__)
app.config.from_object('Config')

migrate = Migrate(app,db)
manager = Manager(app)
manager.add_command('db',MigrateCommand)

if __name__ == "__main__":
    manager.run()

这里的 app.config.from_object 是读取配置文件,里面写上配置文件的没有拓展名的文件名,就是上面的配置文件Config.py 的名字

  • 定义好数据迁移配置后,执行下面命令完成数据迁移:
代码语言:javascript
复制
$ python migrate.py db init

$ python migrate.py db migrate

$ python migrate.py db upgrade

结束之后会生成一个文件夹,里面也会生成一些文件,如下:

代码语言:javascript
复制
migrations
├── README
├── alembic.ini
├── env.py
├── script.py.mako
└── versions
    └── 79d73a8da1cf_.py

Flask-RESTful接口实现app.py

  • 先给出代码
代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 18/6/26 上午11:21
# @Author  : olei
# @File    : app.py
# @Software: PyCharm
# @license : Copyright(C), olei.me
# @Contact : i@olei.me

from flask import Flask, jsonify
from Model import db, Bing
from flask_restful import Resource, Api, reqparse, fields, marshal_with, abort, marshal

app = Flask(__name__)
app.config.from_object("Config")

db.init_app(app)

errors = {
    'BingAlreadyExistsError': {
        'message': "It is already exists.",
        'status': 409,
    },
    'ResourceDoesNotExist': {
        'message': "A resource with that ID no longer exists.",
        'status': 410,
        'extra': "Any extra information you want.",
    },
}

api = Api(app, catch_all_404s=True, errors=errors)

parser = reqparse.RequestParser()
parser.add_argument('dates', required=True)
parser.add_argument('bing_url', required=True)
parser.add_argument('qiniu_url', required=True)
# parser.add_argument('user_nickname')
parser.add_argument('image_name', required=True)

resource_full_fields = {
    'id': fields.Integer,
    'dates': fields.String,
    'bing_url': fields.String,
    'qiniu_url': fields.String,
    'image_name': fields.String
}


class Common:
    def returnTrueJson(self, data, msg="请求成功"):
        return jsonify({
            "status": 1,
            "data": data,
            "msg": msg
        })

    def returnFalseJson(self, data=None, msg="请求失败"):
        return jsonify({
            "status": 0,
            "data": data,
            "msg": msg
        })


class Hello(Resource):
    def get(self):
        return 'Hello Flask!'


class Bing_all(Resource):
    def get(self):
        # dates = Bing.query.filter_by()
        return Common.returnTrueJson(Common, marshal(Bing.query.all(), resource_full_fields))


class Bing_url(Resource):
    def get(self, dates):
        dates = Bing.query.filter_by(dates=dates).first()
        if (dates is None):
            abort(410, msg="找不到数据!", data=None, status=0)
        else:
            return Common.returnTrueJson(Common, marshal(dates, resource_full_fields))


api.add_resource(Hello, '/', '/hello')
api.add_resource(Bing_all, '/bing')
api.add_resource(Bing_url, '/bing/<string:dates>')

if __name__ == "__main__":
    app.run(debug=app.config['DEBUG'])

分析

  • 错误处理代码
代码语言:javascript
复制
errors = {
    'BingAlreadyExistsError': {
        'message': "It is already exists.",
        'status': 409,
    },
    'ResourceDoesNotExist': {
        'message': "A resource with that ID no longer exists.",
        'status': 410,
        'extra': "Any extra information you want.",
    },
}

api = Api(app, catch_all_404s=True, errors=errors)

调用是通过abort来调用的

代码语言:javascript
复制
 if (dates is None):
     abort(410, msg="找不到数据!", data=None, status=0)
  • 定义一个Common,来统一响应数据格式
  • 处理请求

Flask-RESTful的reqparse用于获取并转化客户端输入参数

代码语言:javascript
复制
parser = reqparse.RequestParser()
parser.add_argument('dates', required=True)
parser.add_argument('bing_url', required=True)
parser.add_argument('qiniu_url', required=True)
# parser.add_argument('user_nickname')
parser.add_argument('image_name', required=True)

上面代码定义了一个请求数据分析转化器(parser),然后指定参数的名称。 在获取参数数据时使用parse_args来转化所有的参数,并返回一个输入数据字典。 代码里面没有用到,这个是post,delete等请求会用到,就是增删改用

  • 处理响应

Flask-RESTful的fields用于规范响应字段,定制响应字段键名和键值数据类型,还可以对输出响应做更多复杂的处理。输出响应时,可以使用装饰器或函数式两种方式作处理:

装饰器方式:

@marshal_with(resource_full_fields, envelope=’data’)

函数方式:

marshal(User.query.all()

代码中用了函数方式来处理

运行

代码语言:javascript
复制
$ python app.py
Flask RESTful API 简单的设计一个 GET 请求接口
Flask RESTful API 简单的设计一个 GET 请求接口
Flask RESTful API 简单的设计一个 GET 请求接口
Flask RESTful API 简单的设计一个 GET 请求接口
Flask RESTful API 简单的设计一个 GET 请求接口
Flask RESTful API 简单的设计一个 GET 请求接口

后记

忽略app.py中我对dates的处理...

本文作者为olei,转载请注明。

flask postgresql RESTful API

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-06-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前提
  • 需要的Python环境
  • 创建配置文件Config.py
  • 数据模型Model.py
  • 数据库迁移文件migrate.py
  • Flask-RESTful接口实现app.py
    • 分析
    • 运行
    • 后记
    相关产品与服务
    数据库
    云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档