目录 style="font-size: 14pt;">前言 style="font-size: 14pt;">1 准备工作 style="font-size: 14pt;">2 具体实现     前言 近些年在捣鼓如何使用阿里云服务器搭建一个简单的基于Flask框架的后端接口,刚开始为了图便宜,就直接买了一个Windows Server 2008系列服务器,这也埋下了不小的..." />

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 可能的来由及缓解情势

附:

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

切切实实如下图:

 json 2

json 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

 

 json 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
。)

json, 

关于实际怎么使用,可以查看下面小说介绍,也得以参见下文的切实运用代码。

 

 


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

 json 5

 

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

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

 json 6

接下来,点开下图中Body,采取raw,添加要存入的json格式数据,如下:

 json 7

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

 

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

 json 8

 

Delete格局和Put请求几乎一致,不同的是一个实施修改操作,一个实践删除操作而已,具体如下图:

 json 9

 

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

 

 

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

2.理解RESTful架构

3.MONGODB
RESTFUL API WITH
FLASK

 

相关文章

网站地图xml地图