RESTful API进阶:连接数据库、添加参数、Token认证、返回代码说明等

bluebird 发布于1月前 阅读937次
0 条评论

RESTful API进阶:连接数据库、添加参数、Token认证、返回代码说明等

关于RESTful API的基础入门知识,请移步: 利用Python和Flask快速开发RESTful API

上篇文章只介绍了RESTful API的基本思想、基本操作等,并没有涉及一些进阶的知识,这里接上一篇文章,继续学习RESTful API。

老规矩,文中代码整理后Push到Github: xianhu/LearnPython

利用sqlalchemy连接数据库

关于sqlalchemy的基本操作,可参考这篇文章:知乎专栏,这里直接上代码:

# 数据库相关变量声明
engine = sqlalchemy.create_engine("mysql+pymysql://username:password@ip/db_name", encoding="utf8", echo=False)
BaseModel = sqlalchemy.ext.declarative.declarative_base()

# 构建数据模型User
class User(BaseModel):
    __tablename__ = "Users"
    __table_args__ = {
        "mysql_engine": "InnoDB",
        "mysql_charset": "utf8",
    }

    # 表结构,具体更多的数据类型自行百度
    id = sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True, autoincrement=True)
    name = sqlalchemy.Column("name", sqlalchemy.String(50), nullable=False)
    age = sqlalchemy.Column("age", sqlalchemy.Integer, nullable=False)

# 利用Session对象连接数据库
DBSessinon = sqlalchemy.orm.sessionmaker(bind=engine)
session = DBSessinon()
BaseModel.metadata.drop_all(engine)
BaseModel.metadata.create_all(engine)

连接数据库并建立相应的数据表之后,get操作代码如下:

class Todo(Resource):

    def get(self, user_id):
        users = session.query(User).filter(User.id == user_id)

        # 用户不存在,返回404
        if users.count() == 0:
            return None, 404

        # 返回用户数据
        return get_json(users[0]), 200

class TodoList(Resource):

    def get(self):
        args = parser_get.parse_args()
        users = session.query(User)

        # 返回结果
        return [get_json(user) for user in users], 200

post、put以及delete等操作类似,具体可参考github代码: xianhu/LearnPython

添加参数sortby,offset,limit等,完成复杂查询

有时候我们get数据时,希望能按照相应的列排序,并返回特定条数的数据。代码如下:

def get(self):
        args = parser_get.parse_args()
        users = session.query(User)

        # 根据条件查询
        if "sortby" in args:
            users = users.order_by(User.name if args["sortby"] == "name" else User.age)
        if "offset" in args:
            users = users.offset(args["offset"])
        if "limit" in args:
            users = users.limit(args["limit"])

        # 返回结果
        return [get_json(user) for user in users], 200

其实这里的查询也不复杂,只是举个例子,给个思路,其他更多的和业务相关的应用,具体情况具体分析。添加完参数之后,我们查询时可以:

curl http:../users -X GET -d "limit=2&offset=0&sortby=name"

添加Token认证

有时候(绝大部分时候)我们不希望自己写的API被陌生人访问,即需要添加认证。RESTful API的认证方法有很多,这里我们只举个例子,利用Flask的flask_httpauth扩展添加Token认证。首先,我们需要编写认证函数:

from flask_httpauth import HTTPTokenAuth

# 认证相关
auth = HTTPTokenAuth(scheme="token")
TOKENS = {
    "fejiasdfhu",
    "fejiuufjeh"
}

@auth.verify_token
def verify_token(token):
    if token in TOKENS:
        g.current_user = token
        return True
    return False

然后,在对应的类中添加装饰器:

class Todo(Resource):
    # 添加认证
    decorators = [auth.login_required]

class TodoList(Resource):
    # 添加认证
    decorators = [auth.login_required]

添加完认证后,我们在查询中需要添加Token值:

curl http:.../users -X GET -H "Authorization: token fejiasdfhu"

RESTful API返回代码汇总

200 OK - [GET]:服务器成功返回用户请求的数据
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作
406 Not Acceptable - [GET]:用户请求的格式不可得
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功

=============================================================

作者主页: 笑虎(Python爱好者,关注爬虫、数据分析、数据挖掘、数据可视化等)

作者专栏主页: 撸代码,学知识 - 知乎专栏

作者GitHub主页: 撸代码,学知识 - GitHub

欢迎大家拍砖、提意见。相互交流,共同进步!

==============================================================

查看原文:RESTful API进阶:连接数据库、添加参数、Token认证、返回代码说明等

共收到0条回复

需要 登录 后回复方可回复, 如果你还没有账号你可以 注册 一个帐号。