├── .gitignore ├── README.md ├── requirements.txt └── simple_db_api ├── __init__.py ├── app.py └── run.py /.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rfyiamcool/simple_db_api/3c82929cab9e7b527ba16f94bde9b91cd689fd44/.gitignore -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # simple_db_api 2 | 3 | ``` 4 | 获取数据 5 | 6 | GET /get?key=xiaorui&key=liudehua HTTP/1.1 7 | 8 | 获取区间数据 9 | 10 | GET /getrange?from=xiaorui HTTP/1.1 11 | 12 | 添加数据 13 | 14 | GET /put?blog=xiaorui HTTP/1.1 15 | 16 | 删除数据 17 | 18 | GET /delete?key=xiaorui&key=liudehua HTTP/1.1 19 | ``` 20 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Flask==0.10.1 2 | leveldb==0.19 3 | gunicorn==18.0 4 | ujson==1.33 5 | -------------------------------------------------------------------------------- /simple_db_api/__init__.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | from flask import Flask 3 | 4 | web_app = Flask(__name__) 5 | -------------------------------------------------------------------------------- /simple_db_api/app.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | import leveldb 3 | import ujson as json 4 | from flask import request, g 5 | 6 | from simple_db_api import web_app 7 | 8 | 9 | JSON = {'Content-Type': 'application/json'} 10 | 11 | 12 | def ensure_db(): 13 | if 'db' not in g: 14 | g.db = leveldb.LevelDB(web_app.config['DB']) 15 | 16 | 17 | def put(): 18 | ensure_db() 19 | keys = request.args.items(multi=True) 20 | batch = leveldb.WriteBatch() 21 | for k, v in keys: 22 | batch.Put(k, v) 23 | g.db.Write(batch) 24 | return '', 201, JSON 25 | 26 | 27 | def get(): 28 | ensure_db() 29 | keys = request.args.getlist('key') 30 | if not keys: 31 | return '', 204, JSON 32 | response = {} 33 | for k in keys: 34 | try: 35 | response[k] = g.db.Get(k) 36 | except KeyError: 37 | pass 38 | if not response: 39 | return '', 404, JSON 40 | return json.dumps(response), 200, JSON 41 | 42 | 43 | def getrange(): 44 | ensure_db() 45 | from_key = request.args.get('from') 46 | response = {} 47 | vals = g.db.RangeIter(key_from=from_key) 48 | for k, v in vals: 49 | response[k] = v 50 | if not response: 51 | return '', 404, JSON 52 | return json.dumps(response), 200, JSON 53 | 54 | 55 | def delete(): 56 | ensure_db() 57 | keys = request.args.getlist('key') 58 | batch = leveldb.WriteBatch() 59 | for k in keys: 60 | batch.Delete(k) 61 | g.db.Write(batch) 62 | return '', 200, JSON 63 | 64 | 65 | def define_urls(app): 66 | app.add_url_rule('/put', view_func=put, methods=['GET']) 67 | app.add_url_rule('/get', view_func=get, methods=['GET']) 68 | app.add_url_rule('/getrange', view_func=getrange, methods=['GET']) 69 | app.add_url_rule('/delete', view_func=delete, methods=['GET']) 70 | -------------------------------------------------------------------------------- /simple_db_api/run.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | import argparse 3 | 4 | from simple_db_api import web_app 5 | from simple_db_api.app import define_urls 6 | 7 | 8 | def get_options(): 9 | parser = argparse.ArgumentParser() 10 | parser.add_argument('-d', '--debug', action='store_true', default=False) 11 | parser.add_argument('-p', '--port', type=int, default=7532) 12 | parser.add_argument('-b', '--database') 13 | parser.add_argument('-H', '--host', default='127.0.0.1') 14 | return parser.parse_args() 15 | 16 | 17 | def configure_app(app, options): 18 | app.config['DB'] = options.database 19 | define_urls(app) 20 | 21 | 22 | def dev_server(): 23 | options = get_options() 24 | configure_app(web_app, options) 25 | web_app.run(debug=options.debug, port=options.port, host=options.host) 26 | 27 | 28 | def run_server(): 29 | options = get_options() 30 | configure_app(web_app, options) 31 | 32 | from gevent.wsgi import WSGIServer 33 | 34 | server = WSGIServer((options.host, options.port), web_app) 35 | server.serve_forever() 36 | 37 | 38 | if __name__ == '__main__': 39 | run_server() 40 | --------------------------------------------------------------------------------