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
测试方法:
- GET请求,可以直接通过浏览器发送,比如访问 http://1.1.1.1:5000/article/nameA/typeB
- POST/PUT/DELETE 请求,需要通过Postman 软件来模拟。
以上是用Python自带的WSGI HTTP服务器来启动flask服务。Flask的内置server其实并不适用于正式的生产环境,存在性能低下、无法进行更复杂的配置等问题,因此最好将Flask应用部署到专门的服务器程序上。下面介绍下使用gunicorn的好处和使用方法。
介绍:
- Gunicorn是一个WSGI HTTP服务器, Python自带的有个web服务器,叫做wsgiref;
- Gunicorn的优势在于,它使用了pre-fork worker模式,gunicorn在启动时,会在主进程中预先fork出指定数量的worker进程来处理请求;
- gunicorn依靠操作系统来提供负载均衡,推进的worker数量是(2*$num_cores)+1
- 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"