后端api服务器的实现与搭建:python Flask + RESTful API + mysql / slqlite 实践

发布于 2019-08-16  3,919 次阅读


写下这篇文章主要是因为前几天参加比赛花了一整晚部署前后端,借着记忆还留着点做一个存档。
本篇文章将主要介绍 InTexT 项目使用的后端的细节,并将在下一篇介绍具体的前后端部署方法。
目前实习所在的组的后端技术栈是 go + graphql + MongoDB,如果有机会会在未来也写一篇相关的文章。

python flask

选择 python-flask 作为后端的理由很简单,作为一个卖点在于 机器学习 的 web 应用,对于国内软件开发类比赛来说更重要的是快速开发、展示内容的需求,在开发速度以及对算法的支持上来说,python 无疑是一个更好的选择,而 flask 相较 Django 更好的扩展性和自定义的方便是我们最终选择 flask 的原因。

后端结构

EBC32B14-0630-43D5-B306-CDB429A59EA6.png

如图所示,整个项目结构以模块作为分块的标准,这是在建立前期考虑到后期算法模块加入做出的决定,可以更直观的区分不同模块,因为作为后端只提供 API,所以一般只需要 models.py 存放类, resources.py 提供接口。外层的 run.py 作为入口,InTexT 中的 __init__.py 初始化app,manage.py 是用于向数据库创建测试账号和数据的。

  • Flask
  • Flask-RESTful 用于构建 RESTful api
  • Flask-Script 用于 manage.py,但这个库已经停止维护了
  • Flask-Login 这是 flask 钦定的一个模块,总之简单的登陆登出用这个非常方便,也可做到基本的权限管理
  • bcrypt 虽然单单一个 demo 似乎没有必要,但还是加了这个用于密码加密解密
  • Flask-SQLAlchemy 用于连接数据库
  • Flask-CORS 解决跨域问题

RESTful API

注册

正如 python flask 库中所说,本项目采用了 Flask-RESTful 用于搭建 api 服务器,传统的 flask 路由方法是这样的:

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        do_the_login()
    else:
        show_the_login_form()

然鹅这种方式虽然简便,但在提供 RESTful 接口,或者统一管理时过于繁琐。Flask-RESTful 推荐的 api 蓝本的方式,其本身无疑是一个非常好的解决方案,详情可以直接阅读官方文档。这里提供一个折中的方案,即在 __init__.py 中以 api.add_resources(path,api)的方式注册接口。

跨域

作为一个 api 服务器,跨域是一个绕不开的门槛。本项目使用 Flask-CORS 作为后端的跨域解决方案,具体使用过程可以直接阅读官方文档。跨域在前端也需要有一定的设置,这个下次再写,有一些坑似乎在之前的文章里也提到了,可以看一下:Flask-RESTful 后端开发踩的若干的坑

mysql / sqlite

对数据库的操作通过现有的 Flask-SQLAlchemy 也是一件非常容易的事情。首先在 flask 配置文件中填写数据库的位置,以sqlite为例 SQLALCHEMY_DATABASE_URI = 'sqlite:///db.sqlite',然后在 __init__.py 中引入Flask-SQLAlchemy并注册:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy(app)   

最后在各个模块的 models.py 文件中直接引入 db,便可以进行操作:

from InTexT import db 

def save(self, args):
    self.username = args['username']
    self.password = encrypt(args['password'])
    self.email = args['email']
    self.is_active = True
    self.token = 'init'

    db.session.add(self)
    db.session.commit()

Fly me to the moon