Python学习之路--Flask+MongoDB搭建Restful Server
在开发客户端的时候总是需要网络请求的,之前用过java的,node的,感觉都不是非常的方便。再加上机器学习越来越火,索性就用python来开发下web。
1 准备
1.1 Flask
python的主流web框架有django和flask,这里使用了flask。flask是python编写的轻量级 Web 应用框架。
1.2 MongoDB
- MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
- MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
数据库的命令行简单操作:
mongo
> show dbs
admin 0.078GB
config 0.078GB
local 0.078GB
todoApp 0.078GB
> use todoApp
switched to db todoApp
> show collections
accounts
device
device1
system.indexes
user
> db.user.find()
{ "_id" : ObjectId("5a4874bd377863486d2bbd62"), "name" : "test1", "password" : "123456" }
{ "_id" : ObjectId("5a487b143778634acfa46901"), "name" : "test2", "password" : "123456", "device" : ObjectId("5a43a35e37786301612a7b33"), "devices" : [ ObjectId("5a43a35e37786301612a7b33"), ObjectId("5a43a36937786301612a7b34"), ObjectId("5a43a37f37786301752f889c"), ObjectId("5a45ce5a3778631d5636391f") ], "emdevices" : [ { "_id" : ObjectId("5a43a35e37786301612a7b33"), "devicename" : "device1", "macaddr" : "00:11:22:33:44:55" }, { "_id" : ObjectId("5a43a36937786301612a7b34"), "devicename" : "device1", "macaddr" : "00:11:22:33:44:55" }, { "_id" : ObjectId("5a43a37f37786301752f889c"), "devicename" : "device1", "macaddr" : "00:11:22:33:44:55" }, { "_id" : ObjectId("5a45ce5a3778631d5636391f"), "devicename" : "test3", "macaddr" : "00:11:22:33:44:55" } ] }
> db.device.find()
{ "_id" : ObjectId("5a41e13337786350a4d19faf"), "_updated" : ISODate("2017-12-26T05:42:11Z"), "devicename" : "test1", "macaddr" : "00:11:22:33:44:55", "_created" : ISODate("2017-12-26T05:42:11Z"), "_etag" : "b3fd2a4b62fc803529a5315a25ed7777e1c6229e" }
{ "_id" : ObjectId("5a41e2a237786350c4876f7d"), "_updated" : ISODate("2017-12-26T05:48:18Z"), "devicename" : "test2", "macaddr" : "11:11:22:33:44:55", "_created" : ISODate("2017-12-26T05:48:18Z"), "_etag" : "3dee3f048406c5eb5a591164ea9a4b5e2f6c2309" }
{ "_id" : ObjectId("5a41e2aa37786350c4876f7e"), "_updated" : ISODate("2017-12-26T05:48:26Z"), "devicename" : "test3", "macaddr" : "22:11:22:33:44:55", "_created" : ISODate("2017-12-26T05:48:26Z"), "_etag" : "ed88bc3d176d7645782ab2bcc7c30536d221f425" }
{ "_id" : ObjectId("5a41e35c377863510233e7ca"), "_updated" : ISODate("2017-12-26T05:51:24Z"), "devicename" : "test1", "macaddr" : "12:11:22:33:44:55", "_created" : ISODate("2017-12-26T05:51:24Z"), "_etag" : "04a2bf47976ff6dfce3447ca8ea18fcefd8025ae" }
1.3 各种包的安装
利用python的pip需要安装flask, mongengine等。
2 项目实践
先看下整个工程的目录结构,分为app,controllers和models。类似于mvc,其中view在这里还没有,主要是一些api,view的工作都是给客户端来实现的。
.
├── app
│ └── __init__.py
├── config.json
├── controllers
│ ├── __init__.py
│ ├── tasks.py
│ └── users.py
├── models
│ ├── device.py
│ ├── __init__.py
│ └── user.py
└── run.py
2.1 app模块
init.py是初始化的使用用到的。这里是创建了flask,主要在controller中使用,以及创建了mongodb,在models中使用。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask
from flask_mongoengine import MongoEngineapp = Flask(__name__)app.config['MONGODB_SETTINGS'] = {'db': 'todoApp','host': '127.0.0.1','port': 27017
}#app.config.from_pyfile('config.json')
db = MongoEngine(app)#数据库对应的模型
#import models#api的业务逻辑
import controllers
2.2 models模块
先看下device,这里定义了两个字段,一个devicename,一个macaddr。
#!/usr/bin/env python
# -*- coding: utf-8 -*-from app import db# 类名定义 collection
class Device1(db.Document):# 字段devicename = db.StringField()macaddr = db.StringField()def __str__(self):return "devicename:{} - macaddr:{}".format(self.devicename, self.macaddr)
再看下User模型,首先这里定义了name,password和phone几个简单的字段,就不多讲了。
然后定义了device,devices以及emdevices。ReferenceField表示一个引用,最终会引用上述定义的device模板中的实际的数据库数据。而EmbeddedDocumentField则会把实际的数据存入到User中。举个例子,如果device的devicename为“test”。然后devices和emdevices中都可以找到device并且他的名字为"test"。而当把device的表中的devicename改为“test_change”。那么在devices中只是用了引用,所以devicename也改为了“test_change”,而emdevices则还是"test"。
#!/usr/bin/env python
# -*- coding: utf-8 -*-from app import db
from models.device import Device1# 类名定义 collection
class User(db.Document):# 字段name = db.StringField(max_length=30, required=True)password = db.StringField(max_length=30, min_length=6, required=True)phone = db.StringField()device = db.ReferenceField(Device1)devices = db.ListField(db.ReferenceField(Device1))emdevices = db.ListField(db.EmbeddedDocumentField('Device1'))def __str__(self):return "name:{} - phone:{}".format(self.name, self.phone)
2.3 controller模块
这里定义了两个接口,一个是POST的“/todo/api/v1/user”接口,用来保存user字段信息。一个是GET的“/todo/api/v1/user”接口,用来获取当前的user接口的信息,比较简单。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from app import app
from flask import Flask, jsonify, request, abort
from datetime import datetime
from models.user import User
from models.device import Device1@app.route('/todo/api/v1/user', methods=['GET'])
def get_user():devices = Device1.objects().all()print devicesuser = User.objects(name="test2").first()print user#user.update(device=device)#user.update(devices=devices)#print device.devicename#user.update(emdevices=devices)return jsonify({'userinfo': User.objects.all()}), 201@app.route('/todo/api/v1/user', methods=['POST'])
def create_user():if not request.json or not 'name' in request.json or not 'password' in request.json:print(request)abort(400)user = User(name=request.json['name'], password=request.json['password']).save();return jsonify({'userinfo': User.objects.all()}), 201
2.4 运行项目
python run.py
接着可以通过postman来测试接口。可以的话,就可以在客户端使用网络请求了。
3 Linux自启动
3.1 nginx反向代理
nginx反向代理,因为python flask默认的是ip:127.0.0.1,端口5000,所以需要反向代理到我们的服务器上,这样对应域名就可以使用了。
server {listen 3000; # 监听3000端口location / {proxy_pass http://127.0.0.1:5000; # 代理本机127.0.0.1:5000的服务}location /static {#alias /home/ubuntu/myproject/myblog/app/static; # 负载均衡}
}
关于nginx怎么设置这里就不一一介绍了。
3.2 gunicorn
使用gunicorn在多核服务器上,为了支持更多的并发访问并充分利用资源,可以使用更多的 gunicorn 进程。
3.3 supervisor
supervisor是一个用 Python 写的进程管理工具,可以很方便的用来在linux系统下启动、重启(自动重启程序)、关闭进程(不仅仅是 Python 进程)。
在/etc/supervisor/conf.d/目录下新建test.config文件,配置如下
[program:Test]command=/usr/local/bin/gunicorn -c /etc/gunicorn/gun.conf --chdir /todoApp run:app
supervisorctl 一些命令:
help # 查看帮助
status # 查看程序状态
stop program_name # 关闭 指定的程序
start program_name # 启动 指定的程序
restart program_name # 重启 指定的程序
tail -f program_name # 查看 该程序的日志
上述配置只需要执行:
supervisorctl start Test
就可以在后台启动进程了。
后续扩展
基本上这样就可以搭建一个简单的restful的server了。当然结合上jwt(java web token)则更好点。这个就后续扩展吧。
代码可以参考: github中的例子
更完整的项目:极客Go云监工服务端
Python学习之路--Flask+MongoDB搭建Restful Server相关推荐
- python之路 mysql 博客园_教为学:Python学习之路(二):MySQLdb的几种安装方式,以及用Python测试连接MySql...
教为学:Python学习之路(二):MySQLdb的几种安装方式,以及用Python测试连接MySql Easy_install安装MySQLdb 很简单,以至于我不晓得该怎么说.一句话. sodu ...
- Python学习之路—2018/7/14
Python学习之路-2018/7/12 3.功能开发 3.3 设计博客首页 博客首页中最重要的就是中间的文章区域,所以我首先把文章区域设计出来,一开始并没有数据,如果用orm添加或者直接在数据库添加 ...
- Python学习之路—2018/6/20
Python学习之路-2018/6/20 1.模板语法之变量 views.py def index(request):import datetimes="gyq"l=[1,2,3] ...
- Python学习之路9☞面向对象的程序设计
Python学习之路9☞面向对象的程序设计 一 面向对象的程序设计的由来 见概述:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二 什 ...
- python 学习之路开始了
python 学习之路开始了.....记录点点滴滴.... 转载于:https://www.cnblogs.com/chobit/p/6163287.html
- Python学习之路5☞文件处理
Python学习之路5☞文件处理 一.文件处理流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 1 正趣果上果 2 Interesting fruit fruit 3 4 ...
- python学习之路0x00
Python学习之路0x00 在学习python之前,要知道什么是python? python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,与c语言不同, c语言要编译后才能执行.而 ...
- 我的Python学习之路(一)_Mr_Ouyang
我的Python学习之路(一)_Mr_Ouyang 笔者按: 本文从18:55开始写作,至19:38中断,又从21:12始继续,至23:22写就. 共计耗时113分钟,总字数9081字,约80.4字/ ...
- 一木.溪桥---Python学习之路
一木.溪桥---Python学习之路 1.工作十年常常想起的一些人和一些事 2.选择学习Python的初衷 1.工作十年常常想起的一些人和一些事 我是一名成套电气工程师,专业是电气工程及其自动化(供配 ...
最新文章
- 汇总|基于3D点云的深度学习方法
- C#中的ForEach
- 最实用前端开发框架对比评测
- gradle java ide_使用Gradle构建Java项目
- STM32H743+Keil-将变量定义到指定内存
- 振动系统零频率和重频率问题探讨
- 快速上手Spring WebFlux框架
- 为什么黑客都用python-为什么如此多的黑客都用python?
- 从Python迁移到Go的原因和好处
- Confluence 6 配置备份
- 学习记录542@阿里云OCR身份证识别具体实现
- ant design vue 中select默认选中(V2版本)
- HDU4730 We Love MOE Girls
- 2020华师大个人考研总结
- Nonebot QQ机器人插件八:点歌(网易云音乐)
- 【Android 学习】之二维码扫描开发(闪光灯功能)
- 安装应用提示 该文件包与具有同一名称的现有文件包存在冲突。 无法安装
- 街灯变成了平台,世界将会怎样
- 中国知网caj转pdf的免费转换方法
- R_数据视觉化处理_初阶_02
热门文章
- Unity Animator 参数
- 2021年本溪高考成绩查询,2021本溪市地区高考成绩排名查询,本溪市高考各高中成绩喜报榜单...
- php网店程序及运行环境,php运行环境【处理方案】
- 惠普光影精灵5 HP Pavilion Gaming-15-dk0210tx原厂预装Win10系统恢复出厂OEM系统
- rabbitmq无用使用guest用户远程连接
- 阿拉丁和神灯的故事(一)
- SEI坚持使用近20年的软件,你确定不来看一看?
- App Store苹果商店4.3被拒
- ASML加速向中国芯片企业交付光刻机,又有光刻机进入中国工厂
- 西南交通大学计算机历年复试线,西南交通大学MPAcc历年复试分数线汇总(2017-2020)...