写下这篇文章主要是因为前几天参加比赛花了一整晚部署前后端,借着记忆还留着点做一个存档。
本篇文章将主要介绍 InTexT 项目使用的后端的细节,并将在下一篇介绍具体的前后端部署方法。
目前实习所在的组的后端技术栈是 go + graphql + MongoDB,如果有机会会在未来也写一篇相关的文章。
python flask
选择 python-flask 作为后端的理由很简单,作为一个卖点在于 机器学习 的 web 应用,对于国内软件开发类比赛来说更重要的是快速开发、展示内容的需求,在开发速度以及对算法的支持上来说,python 无疑是一个更好的选择,而 flask 相较 Django 更好的扩展性和自定义的方便是我们最终选择 flask 的原因。
后端结构
如图所示,整个项目结构以模块作为分块的标准,这是在建立前期考虑到后期算法模块加入做出的决定,可以更直观的区分不同模块,因为作为后端只提供 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()
Comments | NOTHING