前言
前几天在进行项目开发的时候,发现用Flask写一些轻量化的Web程序还是比较合适的。其实在Flask家族中,为了能够更加方便地开发Restful风格的接口,Flask-restful是一个不错的选择。虽然Flask-restful提供了比较完整的官方文档,但是距离开发上线项目还是不是很方便,因此我写了一个Flask-restful的快速模板。
此项目采用Mysql作为持久层数据库,实现了一个资源的5个接口,满足基本的web开发需求。
项目地址
首先给出项目地址:Flask-restful-quick-start
image-20211113211211982.png
项目简介
首先是项目的文件结构。
<code>├── <span class="hljs-selector-tag">flask_app</span> │ ├── <span class="hljs-selector-tag">common</span> │ │ ├── __<span class="hljs-selector-tag">init__</span><span class="hljs-selector-class">.py</span> │ │ └── <span class="hljs-selector-tag">utils</span><span class="hljs-selector-class">.py</span> │ ├── <span class="hljs-selector-tag">user</span> │ │ ├── __<span class="hljs-selector-tag">init__</span><span class="hljs-selector-class">.py</span> │ │ ├── <span class="hljs-selector-tag">models</span><span class="hljs-selector-class">.py</span> │ │ └── <span class="hljs-selector-tag">views</span><span class="hljs-selector-class">.py</span> │ └── __<span class="hljs-selector-tag">init__</span><span class="hljs-selector-class">.py</span> ├── <span class="hljs-selector-tag">config</span><span class="hljs-selector-class">.py</span> ├── <span class="hljs-selector-tag">LICENSE</span> ├── <span class="hljs-selector-tag">main</span><span class="hljs-selector-class">.py</span> └── <span class="hljs-selector-tag">requirements</span><span class="hljs-selector-class">.txt</span> </code>
项目中采用了蓝图来划分功能块,方便划分项目模块,并且提升可维护性。
目前我认为这是一个相对比较科学的文件组织方案了。
Restful接口设计
基本的接口从两个路由进行接收
<code><span class="hljs-comment">======================================</span> 请求方法 路由 请求内容 POST /userList userInfo GET /userList None GET /user userId PUT /user userInfo DELETE /user userId <span class="hljs-comment">======================================</span> </code>
做一个简单的介绍就是增加资源和查询全部资源从资源列表接口走。
其他地带参数请求和修改、删除等从专门的资源接口走。
这样就能避免GET请求带参数和不带参数的问题了。
在项目中统一的处理能够提升可靠性,降低编码错误,我这里对两点进行了统一。
1、Sqlalchemy的Model层对象和dict之间的转换。
<code><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">row2dict</span><span class="hljs-params">(row)</span>:</span> <span class="hljs-string">""" 参考文档 https://stackoverflow.com/questions/1958219/convert-sqlalchemy-row-object-to-python-dict 将model转换为dict :param row: Sqlalchemy model :return: 输出的字典 """</span> out_dict = {} <span class="hljs-keyword">for</span> column <span class="hljs-keyword">in</span> row.__table__.columns: out_dict[column.name] = str(getattr(row, column.name)) <span class="hljs-keyword">return</span> out_dict </code>
通过以上代码即可轻松地将model转换为dict的字典了。
2、统一的回复内容
<code><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">BaseResponse</span>:</span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(<span class="hljs-keyword">self</span>)</span></span>: <span class="hljs-keyword">self</span>.result_code_success = <span class="hljs-number">200</span> <span class="hljs-keyword">self</span>.result_code_fail = <span class="hljs-number">201</span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">success</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, msg=<span class="hljs-string">"success"</span>, data={})</span></span>: result = { <span class="hljs-string">"code"</span>: <span class="hljs-keyword">self</span>.result_code_success, <span class="hljs-string">"message"</span>: msg, <span class="hljs-string">"data"</span>: data } <span class="hljs-keyword">return</span> jsonify(result) <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">fail</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, msg=<span class="hljs-string">"fail"</span>, data={})</span></span>: result = { <span class="hljs-string">"code"</span>: <span class="hljs-keyword">self</span>.result_code_fail, <span class="hljs-string">"message"</span>: msg, <span class="hljs-string">"data"</span>: data } <span class="hljs-keyword">return</span> jsonify(result) </code>
统一的回复内容包括了“成功”和“失败”两种情况,可自定义回复编码和内容。
启动项目
安装
首先克隆本项目
<code>$ git <span class="hljs-built_in">clone</span> git@github.com:Jarrettluo/flask-restful-quick-start.git <span class="hljs-built_in">cd</span> flask-restful-quick-start </code>
建议大家使用ide创建一个虚拟环境venv,避免项目使用的包与系统包不一致。
<code>$ pip install requirements.txt </code>
最后启动项目,开始开发
<code>$ python run main.py </code>
修改配置
在项目中的init.py中设置了连接数据库的各项参数,这些都是需要来自定义设置的。
<code>user = <span class="hljs-string">"root"</span> password = <span class="hljs-string">"123456"</span> database = <span class="hljs-string">"flask_quick"</span> <span class="hljs-comment"># 需要修改的内容</span> app.config[<span class="hljs-string">"SQLALCHEMY_DATABASE_URI"</span>] = <span class="hljs-string">"mysql://%s:%s@localhost:3306/%s"</span> % (user, password, database) </code>
在这里使用了MysqlDB,可以根据实际情况,进行修改。
同时也强烈建议大家将这些设置信息放到config.py文件中,这样方便统一修改。
在主程序中,防止了一个数据库初始化的方法,可以进行数据库的清空和创建。
<code><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">init_db</span><span class="hljs-params">()</span>:</span> <span class="hljs-comment"># 丢掉全部表</span> db.drop_all() <span class="hljs-comment"># 创建全部表</span> db.create_all() </code>
快速开发
增加模块就只需要将现有的user模块复制以后进行修改即可。
在flask_app.__init.py中注册蓝图
<code><span class="hljs-keyword">from</span> flask_app.user <span class="hljs-keyword">import</span> user_blueprint app.register_blueprint(user_blueprint, url_prefix=<span class="hljs-string">"/user"</span>) </code>
在flask_app.user.__init.py中增加蓝图
<code>user_blueprint = Blueprint(<span class="hljs-string">"user_blueprint"</span>, __name__, url_prefix=<span class="hljs-string">"/user"</span>) <span class="hljs-keyword">from</span> flask_app.user <span class="hljs-keyword">import</span> views </code>
enjoy。
结尾
纯新手向的指导,更多的内容请参考Flask_restful的官方文档.