美学原理应用Flask+MongoDB完结基于REST的接口不难操作

style=”font-size: 18pt;”>目录

style=”font-size: 14pt;”>前言

style=”font-size: 14pt;”>1
准备工作

style=”font-size: 14pt;”>2
具体完成

 

 


前言

近日在捣鼓怎么样运用Ali云服务器搭建三个简易的基于Flask框架的后端接口,刚早先为了图方便,就一贯买了一个Windows
Server 二〇〇八系列服务器,那也埋下了一点都不小的坑。

 

劳动买下来后,会给您1个公网IP和内网IP,由于是率先次学习搭建后端接口,对于如何科学行使Ali云服务器,来拍卖好公网IP和内网IP之间的关联埋下了非常的大的坑,真是对应的一句话:技术的成材往往是一步二个坑。

 

上面简单说一下搭建Flask服务器端境遇的难题:

率先,Flask自带了叁个服务器,直接采取很便利,可是那么些服务器的质量太低,但是对于调节和测试和读书或许绰绰有余。刚初阶把代码放到Ali云服务器上,并跑通后,测试接口时公网IP不或者访问,那时自个儿觉得是Flask自带服务器的标题,即因为Flask自带服务器原因促成力不从心使用公网IP访问。

 

那正是说,难题应运而生了,就要摸索消除办法吧,网上搜寻资料提交参照意见:使用nginx
+gunicorn来布局Flask相关服务,可避防止公网IP不恐怕访问难题。然后,笔者就去找材质,安装gunicorn,结果运转测试时间接报错,最后发现gunicorn不支持Windows系统,那也太坑了,早精通自个儿及时买服务器时就不应该图方便,间接买一个基于Linux的连串了。

 

今后,新的题材又来了,既然无法采取nginx
+gunicorn来布署Flask相关服务,那就要选用别的格局来消除吗,网上资料参照结果:使用tornado。好,那么自身又来查阅学习tornado布署应用开发文书档案,依照支付文书档案布置完成后,在服务器上跑通后,发现如故不能够利用公网IP进行接口访问和测试。

 

到了此间,就让笔者反省,这几个难道真是Flask安排应用服务器难点吗?后来,就在网上找到了一篇有关Ali云公网IP不可能访问难点的篇章,发现这几个要求本身去Ali云官网上去配置安装。

 

即以上遭逢的难点,压根就不是Flask安插服务器难题,是和谐不曾搞掌握Ali云服务器怎样利用的难点……

 

实际安顿安装格局见:Ali云服务器 ECS 访问不了公网 ip 只怕的缘由及解决办法

附:

 美学原理 1

 

 


1 准备干活

导入Flask及相关扩大:

pip
install flask

pip
install flask-pymongo

pip
install
tornado(此处可选可不选。假若不选用,直接利用Flask自带的服务器安顿即可;假诺选取,能够应用tornado安排)

 

MongoDB数据库绑定服务ip地址设置(PS:假使不进行下述设置,暗中认可ip为本机127.0.0.1地点):

开拓CMD,进入MongoDB安装的bin文件夹下,例如笔者的安装目录为:C:\Program
Files\MongoDB\Server\3.2\bin

然后在CMD中输入mongod.exe
–bind_ip yourIPadress

中间参数–bind_ip意思:绑定服务IP,若绑定127.0.0.1,则只能本机访问,不钦定暗许本地全体IP。(注意:在那之中yourIPadress填写自身搭建服务器的内网ip地址)

切切实实如下图:

 美学原理 2

美学原理 3

 

拉开Flask自带的服务器,一般采取app.run(),当中一般选取如下多个参数:host(内定ip地址,要是不填写,默许为127.0.0.1)、port(钦赐使用的端口,如若不钦赐,私下认可为陆仟端口)、debug(开启调节和测试形式,暗中认可值为Flase,即不开启调节和测试格局,如要开启则能够安装为True)。

 

一旦在服务器上搭建Flask接口相关服务,设置其中host=’0.0.0.0’表示在公网ip下的同叁个局域网段全数ip都得以访问这几个服务,假使把host内定为当中1个内网ip地址,则这些局域网下全体用户可以通过走访那个钦点的ip地址访问Flask服务。

 

前边介绍能够稍微看看,也一定于是询问一下nginx
+gunicorn以及tornado的基本概念。也得以忽略,直接查看2
具体完成

 

运用nginx
+gunicorn来铺排Flask相关服务,即不选择Flask自带的服务器。

 

看看地点的布置情势,作为初学者,不免会有新的疑点,什么是nginx和gunicorn呢?

自笔者本身也是新接触的,查看了一晃网上资料,大约领会了弹指间。

 

什么是nginx呢?

摘要自百度百科(https://baike.baidu.com/item/nginx/3817705?fr=aladdin)的一段解释:Nginx是一款[轻量级](https://baike.baidu.com/item/%E8%BD%BB%E9%87%8F%E7%BA%A7/10002835)的[Web](https://baike.baidu.com/item/Web/150564) 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在二个BSD-like
协议下发行。其特征是占有内部存款和储蓄器少,并发能力强,事实上nginx的产出能力确实在同体系的网页服务器中显现较好,中华夏族民共和国陆地使用nginx网站用户有:百度、京东、新浪、搜狐、腾讯、天猫商城等。

 

什么是gunicorn呢?

摘要自网上二次小说(http://www.pythontip.com/blog/post/5155/)一段解释:Gunicorn“绿色独角兽”是一个被广泛使用的高性能的Python
WSGI UNIX HTTP服务器,移植自Ruby的独角兽(Unicorn )项目,使用pre-fork
worker格局,具有应用相当不难,轻量级的资源消耗,以及高质量等性情。

Gunicorn
服务器作为wsgi
app的器皿,能够与各个Web框架包容(flask,django等),得益于gevent等技术,使用Gunicorn能够在基本不转移wsgi
app代码的前提下,小幅升高wsgi app的性质。

 

见到上边包车型客车化解办法,试着搭建筑和安装装,发现gunicorn不协助Windows系统,坑啊,早知道这么就买3个Linux服务器。

利用gunicorn报错音信:

Traceback (most recent call last):

  File "d:\program files (x86)\python27\Lib\runpy.py", line 174, in _run_module_as_main

    "__main__", fname, loader, pkg_name)

  File "d:\program files (x86)\python27\Lib\runpy.py", line 72, in _run_code

    exec code in run_globals

  File "E:\WorkPlace\Git_python\liu_demo\venv\Scripts\gunicorn.exe\__main__.py", line 5, in <module>

  File "e:\workplace\git_python\liu_demo\venv\lib\site-packages\gunicorn\app\wsgiapp.py", line 10, in <module>

    from gunicorn.app.base import Application

  File "e:\workplace\git_python\liu_demo\venv\lib\site-packages\gunicorn\app\base.py", line 12, in <module>

    from gunicorn import util

  File "e:\workplace\git_python\liu_demo\venv\lib\site-packages\gunicorn\util.py", line 9, in <module>

    import fcntl

ImportError: No module named fcntl

 

 美学原理 4

 

然而作者的服务器依然是Windows版本,Flask服务器环境还是要搭建,那么得使用什么样方案吧?

此地推荐使用tornado。

那么如何是tornado呢?

摘抄至网上一篇文章http://www.tornadoweb.cn/)介绍:Tornado 是 FriendFeed 使用的可扩展的非阻塞式
web 服务器及其有关工具的开源版本。那么些 Web
框架看起来有个别像 web.py 或者 Google 的
webapp
,不过为了能有效使用非阻塞式服务器环境,这么些Web 框架还隐含了部分相关的立竿见影工具 和优化。

Tornado
和今后的主流 Web 服务器框架(包蕴大多数 Python
的框架)有着明显的分歧:它是非阻塞式服务器,而且速度特出快。得利于其
非阻塞的方法和对 epoll 的运用,Tornado
每秒能够拍卖数以千计的总是,那意味对于实时 Web 服务以来,Tornado
是一个名牌产品特产产品优品的 Web 框架。大家付出这几个 Web 服务器的重中之重指标即是为了处理
FriendFeed 的实时作用 ——在 FriendFeed
的利用里每叁个活动用户都会维持着二个服务器连接。(关于什么扩容服务器,以拍卖数以千计的客户端的总是的难题,请参阅 C10K
problem
。)

 

关于具体怎么利用,能够查阅下边小说介绍,也足以参见下文的有血有肉运用代码。

 

 


2 具体落到实处

来看下边具体达成代码,会让大家感慨,Python的确是二个华美的语言,Flask框架也着实是对应小而又轻量级的框架美称呀。使用MongoDB数据库,操作数据库也变得颇为简约。

 

在看上面代码以前,供给不难说一下REST的骨干考虑原理,也相当于是自身要好更加加剧影像吧。下边解释应用自阮一峰博客的一个评论,作者深感这样描述的很有理。

 

REST七个着力尺度:
1.使用HTTP动词:GET
POST PUT DELETE;
2.无状态连接,服务器端不应保存过多上下文状态,即每一种请求都是独自的;
3.为每一个能源设置UKugaI;
4.经过XML
JSON实行多少传递;
落实上述条件的框架结构即可称为RESTFul架构。
1.网络环境下,任何利用的架构和API能够被神速精晓;
2.分布式环境下,任何请求都足以被发送到任意服务器;
3.异构环境下,任何财富的走访和动用格局都合并;

 

看来地点介绍,既然说了REST格局使用HTTP动词GET
POST PUT DELETE来落到实处相关操作。

那正是说上边代码就不难达成一下那七个动词的具体操作成效。

GET:完结从服务器后台获取数据作用,例如登陆接口功用达成;

POST:完结向服务器后台提交数据作用,例如登记接口作用达成;

PUT:达成修改服务器后台已有数据功用;

DELETE:完结删除服务器后台已有数据功效。

 

看完上边介绍,下边就请看代码:

要是不行使tornado,直接行使上面3个mongo.py文件中代码即可兑现本文标题所述功效:

#coding=utf-8
#mongo.py
from flask import Flask,abort
from flask import jsonify
from flask import request
from flask_pymongo import PyMongo


app = Flask(__name__)

app.config['MONGO_DBNAME'] = 'rest'
app.config['MONGO_URI'] = 'mongodb://172.18.252.20:27017/rest'  #如果部署在本上,其中ip地址可填127.0.0.1

mongo = PyMongo(app)

@app.route('/login', methods=['GET'])
def get_all_users():
  star = mongo.db.userInfo.find()
  output = []
  for s in star:
    output.append({'name' : s['name'], 'pwd' : s['pwd']})
  return jsonify({'result' : output})


@app.route('/register', methods=['POST'])
def add_user():
  star = mongo.db.userInfo
  name = request.json['name']
  pwd = request.json['pwd']
  star_id = star.insert({'name': name, 'pwd': pwd})
  new_star = star.find_one({'_id': star_id })
  output = {'name' : new_star['name'], 'pwd' : new_star['pwd']}
  return jsonify({'result' : output})

@app.route('/modify/<string:name>', methods=['PUT'])
def update_user(name):
    user = mongo.db.userInfo.find({"name":name})
    output = []
    for s in user:
      output.append({'name': s['name'], 'pwd': s['pwd']})
    if len(output) == 0:
      abort(404)
    mongo.db.userInfo.update({"name":name},{'$set':{"name":"LZ111"}})
    return jsonify({'result': output})

@app.route('/delete/<string:name>', methods=['DELETE'])
def delete_user(name):
    user = mongo.db.userInfo.find({"name": name})
    output = []
    for s in user:
      output.append({'name': s['name'], 'pwd': s['pwd']})
    if len(output) == 0:
      abort(404)
    mongo.db.userInfo.remove({'name': name})
    return jsonify({'result': True})



if __name__ == '__main__':
    # app.run(host = '0.0.0.0', port = 80, debug = True)
    app.run()

美学原理, 

倘诺利用tornado,新建一个tornado_server.py文件,添加以下代码,作为Flask服务运行铺排,也能够完毕相关功用:

#coding=utf-8
#tornado_server.py
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop

from mongo import app


http_server = HTTPServer(WSGIContainer(app))
# http_server.listen(9000)  #此时,开启端口9000,默认本机127.0.0.1的IP地址
http_server.bind(80, "172.18.252.20")# 开启端口为9000,172.18.252.20为内网ip地址,也可以设置为0.0.0.0,
http_server.start(1)
IOLoop.instance().start()

 

看完上边代码,点击运行,即可兑现相关接口作用了。既然是接口,GET格局幸好说,若是是POST方式,使用浏览器就不那么好操作了,此时大家须要采纳一款接口测试软件,在那边自身引进应用Postman(PS:Postman百度经验介绍Postman官网下载链接),如若有同学利用基于Linux相关系统,推荐应用CU凯雷德L来达成。

 

上面就正式开班利用Postman测试Get、Post、Put和Delete格局接口:

Get格局,选中下图中下拉框GET情势,直接输入U本田CR-VL,然后点击Send红棕按钮即可获得请求数据。

 美学原理 5

 

Post方式,选中下拉框中Post格局,那里由于要发送数据,必要多少设置一下。

首先,在下图中Headers中要选择Content-Type的多少方式,那里作者选取的是json格式:

 美学原理 6

下一场,点开下图中Body,采用raw,添加要存入的json格式数据,如下:

 美学原理 7

终极,点击Send按钮,在最上面出现有关提醒音讯后,即可查看Post请求结果。

 

Put情势操作和Get情势相同,差别的是内需选中操作办法为Put,具体如下图:

 美学原理 8

 

Delete格局和Put请求差不离等同,不一致的是一个履行修改操作,贰个执行删除操作而已,具体如下图:

 美学原理 9

 

基本操作就这么,看完下面代码,发现使用FLask+MongoDB写后端接口是或不是专程简单?

 

 

参考资料:
1.Designing a
RESTful API with Python and
Flask
(PS:附加二个中文版,可是在那之中代码有bug)

2.理解RESTful架构

3.MONGODB
RESTFUL API WITH
FLASK