美学原理用Flask+MongoDB实现基于REST的接口简单操作

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

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

style=”font-size: 14pt;”>1
准备干活

style=”font-size: 14pt;”>2
具体贯彻

 

 


前言

最近以挑如何用阿里云服务器搭建筑一个粗略的基于Flask框架的后端接口,刚开头为贪图便宜,就直进货了一个Windows
Server 2008系统服务器,这也掩盖下了非略之坑。

 

劳进下来后,会让你一个公网IP和内网IP,由于是首先不行上搭建后端接口,对于如何正确用阿里云服务器,来处理好公网IP和内网IP之间的涉及蒙下了未小之坑,真是对应的一样句话:技术之成人往往是一步一个坑。

 

脚简单说一下搭建Flask服务器端遇到的题材:

先是,Flask自带了一个服务器,直接采用特别有益于,不过这服务器的性质最没有,但是对于调试以及读书或绰绰有余。刚起拿代码放到阿里云服务器上,并跑通后,测试接口时公网IP无法访问,那时自己看是Flask自带服务器的问题,即坐Flask自带服务器原因导致无法采取公网IP访问。

 

那,问题应运而生了,就如找解决办法吧,网上查找资料被起参考意见:使用nginx
+gunicorn来安排Flask相关服务,可以免公网IP无法访问问题。然后,我就是去找寻材料,安装gunicorn,结果运行测试时直报错,最后发现gunicorn不支持Windows系统,这吗绝坑了,早明白自家当即进服务器时就非拖欠图方便,直接购买一个基于Linux的网了。

 

今日,新的题目还要来了,既然无可知应用nginx
+gunicorn来布局Flask相关服务,那便设下其他措施来化解吧,网上资料参照结果:使用tornado。好,那么自己而来查看学习tornado部署应用开发文档,按照支付文档部署完毕后,在服务器上走通后,发现仍然不克下公网IP进行接口访问与测试。

 

至了此地,就于自己反省,这个难道真是Flask部署应用服务器问题为?后来,就以网上找到了扳平首关于阿里云公网IP无法访问问题的章,发现这要好失去阿里云官网上去配置安装。

 

尽管以上遇到的题目,压根就非是Flask部署服务器问题,是协调没来明白阿里云服务器如何下的题目……

 

现实安排安装方式展现:阿里云服务器 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(指定使用的端口,如果无点名,默认为5000端口)、debug(开启调试模式,默认值为Flase,即不上马起来调试模式,如一旦开启则足以装也True)。

 

假定在服务器上加码建筑Flask接口相关服务,设置中host=’0.0.0.0’表示以公网ip下之以及一个局域网段所有ip都可以拜这服务,如果将host指定为里一个内网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系统,坑啊,早明白这么就是采购一个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.也每个资源设置URI美学原理;
4.经XML
JSON进行数量传递;
落实上述条件的架即可称为RESTFul架构。
1.互联网环境下,任何利用的架和API可以于很快理解;
2.分布式环境下,任何要都足以叫发送至自由服务器;
3.异构环境下,任何资源的顾和采取方法还统一;

 

来看地方介绍,既然说了REST方式使用HTTP动词GET
POST PUT DELETE来实现相关操作。

这就是说下代码就简单实现转马上四独动词的具体操作功能。

GET:实现从服务器后台获取数据功能,例如登陆接口功能实现;

POST:实现向服务器后台提交数据功能,例如登记接口功能实现;

PUT:实现修改服务器后台就发出数量功能;

DELETE:实现删除服务器后台就起数据功能。

 

扣押了上面介绍,下面就是呼吁看代码:

要是未动tornado,直接用下一个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相关系统,推荐以CURL来促成。

 

下面就是正式启幕应用Postman测试Get、Post、Put和Delete方式接口:

Get方式,选中下图中下拉框GET方式,直接输入URL,然后点击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