基于Flask开发企业级REST API应用(一)

关于我
编程界的一名小小程序猿,目前在一个创业团队任team lead,技术栈涉及Android、Python、Java和Go,这个也是我们团队的主要技术栈。
Github:github.com/hylinux1024
微信公众号:angrycode

前面对Python WEB框架Flask的源码进行走读,对服务的启动流程、路由原理和模板渲染有了一个宏观的认识。不过说了那么多理论,接下来就利用Flask开发一个企业级的API应用。

我选用团队最近开发的一个企业应用作为案例。这是一个恋爱交友应用,本来是使用JavaSpringBoot框架进行开发的,不过为了避免不必要的麻烦,我会使用Flask进行改造,当然这个案例我还会精简一下,保持核心业务的同时,重点关注其中涉及到的技术和工具库的使用,最大限度的还原项目开发的完整流程。

0x00 技术栈

这里我们使用Python版本为3.7,WEB框架当然就是Flask,数据库使用MySqlORM使用SqlAlchemy,使用Redis作为缓存,可能还会使用到序列化工具库marshmallow

开发环境使用venv,部署服务环境会使用nginx+gunicorn+supervisord

因此整个技术栈为

# 开发技术栈
Python3.7+venv+Flask+MySql+SqlAlchemy+Redis+marshmallow
# 部署技术栈
Python3.7+venv+nginx+gunicorn+supervisord
复制代码

当然企业实际开发中还需要编写接口文档,用于各端同学的交互。我们可以使用postman或者淘宝的API文档服务。

0x01 项目设计

技术选型做好之后,先不急于写代码,而是先把项目前期的设计做好,根据业务需求理清功能模块、数据库表结构、接口文档等。

我们的需求是做一个恋爱交友的应用,那么它主要功能模块就应该有

  • 登录注册
    这里使用用户手机号进行登录注册
  • 用户列表
    用户登录后,可以查看当前热门推荐的用户
  • 联系人列表
    联系过的用户,会出现在联系人列表中
  • 聊天模块
    给用户发送消息,消息类型包括文本、语音等
  • 附近的人
    根据用户登录的地理位置,查看附近的人
  • 谁看过我
    查看谁看过我,这个可以作为VIP功能
  • 个人信息
    包括用户基本信息、用户相册和用户标签等
  • VIP模块
    当用户充值为VIP后可以解锁一些功能,比如查看谁看过我的列表

注意为了避免项目开发周期过长我们主要关注前台api的开发,对于后台管理功能暂时不考虑。

根据这些功能模块,我们对项目中的实体进行抽象主要有

  • 登录授权user_auth
  • 用户基本信息user_info
  • 用户位置location
  • 用户相册user_album
  • 用户标签user_label
  • 标签label
  • 联系人contacts
  • 消息message
  • 访问足迹visitor
  • 充值VIP的商品product
    有月度VIP、季度VIP和年度VIP三种
  • 订单user_order
  • 用户VIP信息vip_info

这些实体在数据库建模中分别对应各自的表。避免代码篇幅太长,这里就不再贴出各表脚本代码。关于sql表结构会在后面的项目地址中给出。

0x02 数据库

我这里使用的是腾讯云的数据库,当然使用本地的数据库也是可以的。

各表的字段如下图

注意这些表我都没有加外键约束。

0x03 项目框架搭建

我使用PyCharm作为开发环境的IDE,创建了一个名为DatingToday项目,结构如下

(venv) ➜  DatingToday tree -L 1
.
├── app.py
├── datingtoday.sql
├── requirements.txt
├── static
├── templates
└── venv
复制代码

注意到我已经把数据库脚本文件放在项目根目录了。
venv环境安装了以下依赖库

(venv) ➜  DatingToday pip list
Package                Version
---------------------- -------
Click                  7.0    
Flask                  1.1.1  
flask-marshmallow      0.10.1 
Flask-SQLAlchemy       2.4.0  
itsdangerous           1.1.0  
Jinja2                 2.10.1 
MarkupSafe             1.1.1  
marshmallow            2.19.5 
marshmallow-sqlalchemy 0.17.0 
pip                    10.0.1 
setuptools             39.1.0 
six                    1.12.0 
SQLAlchemy             1.3.6  
Werkzeug               0.15.5 
复制代码

可以使用命令

(venv) ➜ pip freeze > requirements.txt
复制代码

生成requirements.tx文件。

使用命令

(venv) ➜ pip install -r requirements.txt
复制代码

还原虚拟环境中的依赖。

0x04 总结

本篇是基于Flask开发企业级API应用的第一篇,主要是对项目开发前期的准备工作,包括项目设计、数据库设计以及项目结构搭建,当然实际工作中可能还会先出API文档,让前端的同学可以先动起来,但我这里因为已经是在写文档了,所以API文档就省略了。磨刀不误砍柴工,这些工作都是必需的。

0x05 项目地址

github.com/hylinux1024…

0x06 学习资料

  • palletsprojects.com/p/flask/
  • realpython.com/flask-conne…

转载于:https://juejin.im/post/5d3bc3d25188254cbc32b1cc

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决:Do not use built-in or reserved HTML elements as component id: form

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. vue 新写了个组件,运行工程成功,但界面没有出效果,F12 提示有一个警告: Do not use …

移动语义,右值引用

移动语义 目录 右值引用变量是左值move库函数移动构造函数和移动赋值移动操作库容器和异常移动赋值操作符移动后的对象必须是可以析构的合成移动操作右值移动左值拷贝右值在无法被移动时进行拷贝拷贝和交换赋值操作与移动移动迭代器右值引用和成员函数右值与左值引用的成员函…

集合练习:登录注册功能

需求: 1、登录账号唯一,在注册时验证输入的账号是否可用,若已存在,则不可用,若不存在则可用2、登录时使用账号密码进行验证1 /**2 * author Administrator3 * 登录信息 4 */5 public class UserLogin {6 …

vue 通信、传值的多种方式(超详细)

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 一、通过路由带参数进行传值 ①两个组件 A和B,A组件通过query把orderId传递给B组件(触发事件可以是点击事件、钩子函数等&am…

新手开车 驾驶小秘诀要牢记

有很多人刚买到新车兴奋异常,凭着并不熟练的驾驶技术,过了几天的车瘾后发现,刚买的车怎么出现了这样那样的问题 有很多人刚买到新车兴奋异常,凭着并不熟练的驾驶技术,过了几天的车瘾后发现,刚买的车怎么出现…

chrome中Google插件导出导入

导出插件: 一般电脑默认将你安装的插件存放的位置在:C:\Users(用户)\你的电脑名称\AppData\Local\Google\Chrome\User Data\Default\Extensions 这个文件夹下。这里的 AppData 是个隐藏文件夹,需要显示隐藏文件夹才行…

科目三电子路考操作流程

如果你已经通过科目二场内五项考试,正准备参加科目三电子路考的话,不妨看看由邕江驾校李师傅操作讲解的电子路考考试流程演示视频,每项都有详细介绍操作要领及评判标准哦。 科目三考试项目:上车准备、起步、路口左转弯、通过学校区…

vue Bus 总线 组件间通信

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 有时候两个组件也需要通信(非父子关系)。当然Vue2.0提供了Vuex,但在简单的场景下,可以使…

C++没有调用析构函数

github地址 在项目中遇到一个问题,析构函数没有调用产生了内存泄露。 具体见valgrind检测libevent内存泄露 我们看两个例子 demo1 class Test1; void del(Test1* obj){delete obj; } class Test1{ public:Test1(){printf("Test1\r\n");}~Test1(){pri…

实际操作之路考的这些事

辛苦了这么久练习路考,今天终于实际操作到我路考了。上车以后。关上车门。把考试的单地上给考官。还没有认真的去看考官一眼。于是就听到考官用低沉的声音对我说:你好!当时就感觉有一点意外。没想到考官你这么有礼貌。然后我就没那么紧张了&a…

[C# 网络编程系列]专题十二:实现一个简单的FTP服务器

引言: 休息一个国庆节后好久没有更新文章了,主要是刚开始休息完心态还没有调整过来的, 现在差不多进入状态了, 所以继续和大家分享下网络编程的知识,在本专题中将和大家分享如何自己实现一个简单的FTP服务器。在我们平…

vue 2 使用 Bus.js 实现兄弟 (非父子) 组件通信 简单案例

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 vue2中废弃了$dispatch和$broadcast广播和分发事件的方法。父子组件中可以用props和$emit()。如何实现非父子组件间的通信,可…

jenkins自动化部署

jenkins自动化部署 github地址 首先设置源码地址,jenkins会从仓库中拉取最新代码 拉取代码后运行shell脚本自动进行编译 cd mediaService cmake -S . -B cmake-build-release-hisi3531 -DCMAKE_C_COMPILER/opt/hisi-linux/x86-arm/arm-hisiv500-linux/target/bin…

JS-[IIFE闭包]

JS-IIFE&闭包 IIFE(立即调用函数表达式)示例IIFE实现单例模式闭包计数器例子非闭包实现闭包实现IIFE闭包实现内存泄露解决IIFE(立即调用函数表达式) 示例 (function iife(){ //直接执行,无需调用console.log("hello"); })(); //上面相当于function ii…

学开车不能急于求成,心急上路

我发现很多人开始学开车以后就急着要上路,觉得开车是很简单的事情,个人觉得开车虽然不难(相对于会开车的人来说),但是,虽然不是很难,也不是一学会开车起步就能上路去潇洒的。急于求成的人很容易…

vue 组件间传值、兄弟组件 、bus方式 ( 1 分钟看懂 )

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 bus方式的组件间传值其实就是建立一个公共的js文件,专门用来传递消息 1.建立公共文件,并引入 新建msgBus.js文件…

valgrind检测libevent内存泄露

valgrind检测libevent内存泄露 github地址 在使用封装好的http库时,遇到了如下的内存泄露,一开始在definitely处还存在泄露,这里就不贴图了,已经被淹没了。 根据提示定位出错代码位置,如下图: 这里提示ev…

往对象数组里面添加相同的key 不同的value

应用场景&#xff1a;后盾字段没有发给你 自己补充数据 <div v-for"item in list" :key"item.id"><p>{{ item.id}} ----> {{ item.name}} --->{{ item.sex }}---> {{ item.tel }}---->{{ item.link}}--插入数据</p></di…

vue 子组件 调用、触发父组件中的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我发现了两种写法。 方法一&#xff1a; 子组件&#xff1a; <template><button click"submit">提交</but…

新手必看一位老司机的十年开车经验

今天&#xff0c;小编为大家收集整理了一个老司机的十年开车经验&#xff0c;新手们一定要学哦&#xff0c;因为这种宝贵的开车经验是我们以后开车过程中每天都要用到的常识。将来无论在什么时候&#xff0c;这种宝贵经验都会给我们带来更安全的行车时光。新手必看的十年开车经…