基本实现 MongoDB Flask Restful API 基于gunicorn

Mongodb.py

from flask import Flask, abort
from flask import jsonify
from flask import request
from flask_pymongo import PyMongo
import logging
import time
import json


logging.basicConfig(filename="mongodb_restful_api_" + time.strftime(time.strftime("%Y%m%d", time.localtime())) + ".log",
                    level='INFO')
app = Flask(__name__)
app.config['MONGO_DBNAME'] = 'test'
app.config['MONGO_URI'] = 'mongodb://user:pwd@1.1.1.1:27017/test'
mongo = PyMongo(app)


@app.route("/")
def hello():
    return "Welcome to Python Flask Restful API!"


def format_json(dict_data):
    return json.dumps(dict_data, indent=4, sort_keys=True)


@app.route("/articles/<string:name>/<string:type>", methods=['GET'])
def get_article(name, type):
    output = mongo.db.test.find_one({'Article.Name': name, 'Article.Type': type})
    return jsonify({'result': output})


@app.route("/article", methods=['POST'])
def add_article():
    article = request.get_json()
    name = article['Name']
    type = article['Type']
    existing_data = mongo.db.test.find_one({'Article.Name': name, 'Article.Type': type})
    if existing_data:
        app.logger.info("This new article was already exist, start to update ...")
        mongo.db.calibration.update_one(existing_data, {"$set": article}, upsert=True)
        app.logger.info("Update article data to: {}".format(format_json(article)))
    else:
        mongo.db.test.insert_one(article)
        app.logger.info("Add article data: {}".format(format_json(article)))
    return jsonify({'result': article})


if __name__ == "__main__":
    app.run(host="0.0.0.0")

启动服务:

python3 Mongodb.py

测试方法:

  1. GET请求,可以直接通过浏览器发送,比如访问 http://1.1.1.1:5000/article/nameA/typeB
  2. POST/PUT/DELETE 请求,需要通过Postman 软件来模拟。

以上是用Python自带的WSGI HTTP服务器来启动flask服务。Flask的内置server其实并不适用于正式的生产环境,存在性能低下、无法进行更复杂的配置等问题,因此最好将Flask应用部署到专门的服务器程序上。下面介绍下使用gunicorn的好处和使用方法。

介绍:

  1. Gunicorn是一个WSGI HTTP服务器, Python自带的有个web服务器,叫做wsgiref;
  2. Gunicorn的优势在于,它使用了pre-fork worker模式,gunicorn在启动时,会在主进程中预先fork出指定数量的worker进程来处理请求;
  3. gunicorn依靠操作系统来提供负载均衡,推进的worker数量是(2*$num_cores)+1
  4. Python是单线程的语言,当进程阻塞时,后续请求将排队处理。所用pre-fork worker模式,极大提升了服务器请求负载。

使用方法:

  • 使用 gunicorn 命令行 + options 启动:
# yum install gunicorn
# touch gunicorn.log
# gunicorn -D -w 2 --log-level INFO --log-file=gunicorn.log -b 0.0.0.0:5000 mongodb:app
# gunicorn --help    # 查看gunicorn的具体参数选项使用方法
  • 使用 gunicorn_conf.py 启动:
gunicorn -c gunicorn_conf.py mongodb:app

gunicorn_conf.py 文件内容如下:

workers = 5 # 可以理解为进程数,会自动分配到你机器上的多CPU,完成简单并行化
bind = '0.0.0.0:5000' # 服务使用的端口
pidfile = 'gunicorn.pid' # 存放Gunicorn进程pid的位置,便于跟踪
accesslog = 'logs/gunicorn.log' # 存放访问日志的位置,注意首先需要存在logs文件夹,Gunicorn才可自动创建log文件
errorlog = 'logs/gunicorn.log' # 存放错误日志的位置,可与访问日志相同
reload = False # 如果应用的代码有变动,work将会自动重启,适用于开发阶段
daemon = True # 是否后台运行
timeout = 5 # server端的请求超时秒数
loglevel = "INFO"

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值