Flask——Restful插件

Restful-API规范

我这里就不多说了,点这个传送——>

Flask-Restful

restful api是用于在前端与后台进行通信的一套规范。使用这个规范可以让前后端开发变得更加轻松。Flask-Restful是一个专门用来写restful api的一个插件。安装:pip install flask-restful

使用

  1. 从falsk_restful导入 Api,创建api对象
  2. 写视图函数,这里继承Resource
  3. 定义post/get方法,类似于MethodView
from flask import Flask, render_template, url_for
from flask_restful import reqparse, Api, Resource, inputs, fields, marshal_with

app = Flask(__name__)
# 用Aip来绑定app

api = Api(app)

class IndexView(Resource):
    def get(self):
        return {'username': 'linsang'}

api.add_resource(IndexView, '/', endpoint='index')

if __name__ == '__main__':
    app.run(debug=True)

  • add_resource():添加路由
  • endpoint:给url_for反转url的时候指定的名字

reqparse验证

导入 reqparse ,它的作用跟WTForms的表单验证类似.

  • type:类型
  • help:错误信息
  • required:是否必须输入,默认为false,如果设置为True,却不输入,parse.parse_args()是不会获取到数据的
  • choices:必须是列表中的值
  • inputs.url:检验是否是Url
  • inputs.regex:正则表达式
  • inputs.date:将这个字符串转换为datetime.date数据类型,如果转换不成功,会抛出异常
  • inputs.natural:判断是否为自然数
  • inputs.positive:是否是正整数
  • inputs.int_range(low, high):
  • parse.parse_args():获取数据,字典格式显示
    def post(self):
        parse = reqparse.RequestParser()
        parse.add_argument('username', type=str, help="用户名验证错误", required=True)
        parse.add_argument('password', type=str, help='密码错误')
        parse.add_argument('age', type=inputs.int_range(0,120), help="年龄错误")
        parse.add_argument('gender', type=str, help="性别错误", choices=['male', 'female', 'secret'])
        parse.add_argument('homepage', type=inputs.url, help="url地址错误")
        parse.add_argument('phone', type=inputs.regex(r'(1[357]\d{9})'), help="电话号码错误")
        parse.add_argument('data', type=inputs.date, help="日期时间错误")
        
        args = parse.parse_args()
        print(args)
        return {'info': "登陆成功"}

定义装饰器marshal_with

对于一个视图函数,你可以指定好一些字段用于返回。以后可以使用ORM模型或者自定义的模型的时候,他会自动的获取模型中的相应的字段,生成json数据,然后再返回给客户端。这其中需要导入marshal_with装饰器。并且需要写一个字典,来指示需要返回的字段,以及该字段的数据类型。

  • 获取不到的数据以null 显示
class ArticleView(Resource):
    resource_fields = {
        'title': fields.String,
        'content': fields.String
    }

    @marshal_with(resource_fields)
    def get(self):
        return {'title': 'linsang'}

复杂结构案例

有时候想要在返回的数据格式中,形成比较复杂的结构。那么可以使用一些特殊的字段来实现。比如要在一个字段中放置一个列表,那么可以使用fields.List,比如在一个字段下面又是一个字典,那么可以使用fields.Nested。

  • attribute:重命名属性
  • default:默认值

index.py

from flask import Flask, render_template, url_for, jsonify
from flask_restful import reqparse, Api, Resource, inputs, fields, marshal_with
from exts import db
import config
from models import Article

app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)

# 用Aip来绑定app
api = Api(app)
class IndexView(Resource):
    def get(self):
        return {'username': 'linsang'}

class ArticleView(Resource):
    resource_fields = {
        '文章标题': fields.String(attribute="title"),
        '文章内容': fields.String(attribute="content"),
        '作者信息': fields.Nested({
            '作者': fields.String(attribute="username"),
            '邮箱':fields.String(attribute="email")
        },attribute="author"),
        'tags': fields.List(
            fields.Nested({
                'id':fields.Integer,
                'name':fields.String
            })
        )
    }

    @marshal_with(resource_fields)
    def get(self, article_id):
        article = Article.query.get(article_id)
        return article


api.add_resource(IndexView, '/', endpoint='index')
api.add_resource(ArticleView, '/article/<article_id>', endpoint='article')

if __name__ == '__main__':
    app.run(debug=True)

models.py

from exts import db

class User(db.Model):
    __tablenae__ = 'user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(50))
    email = db.Column(db.String(50))

article_tag_table = db.Table(
    'article_tag',
    db.Column('article_id', db.Integer, db.ForeignKey('article.id')),
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
)

class Article(db.Model):
    __tablename__ = 'article'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(50))
    content = db.Column(db.String(50))
    author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    author = db.relationship('User', backref='article')
    tags = db.relationship('Tag', secondary=article_tag_table, backref="tags")


class Tag(db.Model):
    __tablename__ = 'tag'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(50))

manage.py

# 通过这个文件去映射数据库

from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand

from index import app
from exts import db
import models

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

if __name__ == '__main__':
    manage.run()

exts.py

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

config.py

HOSTNAME = '127.0.0.1'
DATABASE = 'restful_demo'
PORT = 3306
USERNAME = 'root'
PASSWORD = 'root'
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)

SQLALCHEMY_DATABASE_URI = DB_URL  # 创建引擎
SQLALCHEMY_TRACK_MODIFICATIONS= True

# 解决中文乱码问题
RESTFUL_JSON=dict(ensure_ascii=False)

接着通过在命令行执行 python manage.py init初始化,python manage.py migrate更新和python manage.py upgrade上传三连操作把模型映射到数据库。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值