前言

前不久在捣鼓咋样利用阿里云服务器搭建一个简约的基于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 可能的因由及缓解情势

附:

 XML 1

 

 


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

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

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

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


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地址)

XML,现实如下图:

 XML 2

XML 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

 

 XML 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藏蓝色按钮即可取得请求数据。

 XML 5

 

Post模式,选中下拉框中Post形式,这里由于要发送数据,需要多少设置一下。

率先,在下图中Headers中要挑选Content-Type的数据情势,这里自己选拔的是json格式:

 XML 6

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

 XML 7

说到底,点击Send按钮,在最下边出现有关指示音信后,即可查看Post请求结果。

 

Put格局操作和Get模式相同,不同的是需要选中操作办法为Put,具体如下图:

 XML 8

 

Delete形式和Put请求几乎同样,不同的是一个履行修改操作,一个履行删除操作而已,具体如下图:

 XML 9

 

基本操作就如此,看完上边代码,发现使用FLask+MongoDB写后端接口是不是专门简单?

 

 

参考资料:
1.Designing a
RESTful API with Python and
Flask
(PS:附加一个中文版,不过其中代码有bug)

2.理解RESTful架构

3.MONGODB
RESTFUL API WITH
FLASK

 

 

 

相关文章

网站地图xml地图