在开发客户端的时候总是需要网络请求的,之前用过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相关推荐

  1. python之路 mysql 博客园_教为学:Python学习之路(二):MySQLdb的几种安装方式,以及用Python测试连接MySql...

    教为学:Python学习之路(二):MySQLdb的几种安装方式,以及用Python测试连接MySql Easy_install安装MySQLdb 很简单,以至于我不晓得该怎么说.一句话. sodu ...

  2. Python学习之路—2018/7/14

    Python学习之路-2018/7/12 3.功能开发 3.3 设计博客首页 博客首页中最重要的就是中间的文章区域,所以我首先把文章区域设计出来,一开始并没有数据,如果用orm添加或者直接在数据库添加 ...

  3. Python学习之路—2018/6/20

    Python学习之路-2018/6/20 1.模板语法之变量 views.py def index(request):import datetimes="gyq"l=[1,2,3] ...

  4. Python学习之路9☞面向对象的程序设计

    Python学习之路9☞面向对象的程序设计 一 面向对象的程序设计的由来 见概述:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二 什 ...

  5. python 学习之路开始了

    python 学习之路开始了.....记录点点滴滴.... 转载于:https://www.cnblogs.com/chobit/p/6163287.html

  6. Python学习之路5☞文件处理

    Python学习之路5☞文件处理 一.文件处理流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 1 正趣果上果 2 Interesting fruit fruit 3 4 ...

  7. python学习之路0x00

    Python学习之路0x00 在学习python之前,要知道什么是python? python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,与c语言不同, c语言要编译后才能执行.而 ...

  8. 我的Python学习之路(一)_Mr_Ouyang

    我的Python学习之路(一)_Mr_Ouyang 笔者按: 本文从18:55开始写作,至19:38中断,又从21:12始继续,至23:22写就. 共计耗时113分钟,总字数9081字,约80.4字/ ...

  9. 一木.溪桥---Python学习之路

    一木.溪桥---Python学习之路 1.工作十年常常想起的一些人和一些事 2.选择学习Python的初衷 1.工作十年常常想起的一些人和一些事 我是一名成套电气工程师,专业是电气工程及其自动化(供配 ...

最新文章

  1. 汇总|基于3D点云的深度学习方法
  2. C#中的ForEach
  3. 最实用前端开发框架对比评测
  4. gradle java ide_使用Gradle构建Java项目
  5. STM32H743+Keil-将变量定义到指定内存
  6. 振动系统零频率和重频率问题探讨
  7. 快速上手Spring WebFlux框架
  8. 为什么黑客都用python-为什么如此多的黑客都用python?
  9. 从Python迁移到Go的原因和好处
  10. Confluence 6 配置备份
  11. 学习记录542@阿里云OCR身份证识别具体实现
  12. ant design vue 中select默认选中(V2版本)
  13. HDU4730 We Love MOE Girls
  14. 2020华师大个人考研总结
  15. Nonebot QQ机器人插件八:点歌(网易云音乐)
  16. 【Android 学习】之二维码扫描开发(闪光灯功能)
  17. 安装应用提示 该文件包与具有同一名称的现有文件包存在冲突。 无法安装
  18. 街灯变成了平台,世界将会怎样
  19. 中国知网caj转pdf的免费转换方法
  20. R_数据视觉化处理_初阶_02

热门文章

  1. Unity Animator 参数
  2. 2021年本溪高考成绩查询,2021本溪市地区高考成绩排名查询,本溪市高考各高中成绩喜报榜单...
  3. php网店程序及运行环境,php运行环境【处理方案】
  4. 惠普光影精灵5 HP Pavilion Gaming-15-dk0210tx原厂预装Win10系统恢复出厂OEM系统
  5. rabbitmq无用使用guest用户远程连接
  6. 阿拉丁和神灯的故事(一)
  7. SEI坚持使用近20年的软件,你确定不来看一看?
  8. App Store苹果商店4.3被拒
  9. ASML加速向中国芯片企业交付光刻机,又有光刻机进入中国工厂
  10. 西南交通大学计算机历年复试线,西南交通大学MPAcc历年复试分数线汇总(2017-2020)...