Created
September 15, 2016 06:21
-
-
Save RaD/80cdd5a835643a23237f2abd2cdfbb65 to your computer and use it in GitHub Desktop.
Simple RESTful service on Flask with CRUD and GIS
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# requirements: flask-restful | |
import math | |
from flask import Flask | |
from flask_restful import Resource, Api, abort, reqparse | |
app = Flask(__name__) | |
api = Api(app) | |
parser = reqparse.RequestParser() | |
parser.add_argument('name') | |
parser.add_argument('x', type=float) | |
parser.add_argument('y', type=float) | |
users = {} | |
def abort_if_user_not_exists(user_id): | |
if int(user_id) not in users: | |
abort(404, message='User with ID {} does not exist'.format(user_id)) | |
class UserList(Resource): | |
def get(self): | |
return users | |
def post(self): | |
user_id = int(max(users.keys())) + 1 if len(users) > 0 else 1 | |
args = parser.parse_args() | |
users[user_id] = {'name': args['name'], 'x': args['x'], 'y': args['y']} | |
return users[user_id], 201 | |
class User(Resource): | |
def get(self, user_id): | |
abort_if_user_not_exists(user_id) | |
return users[user_id] | |
def put(self, user_id): | |
abort_if_user_not_exists(user_id) | |
args = parser.parse_args() | |
user = {'name': args['name'], 'x': args['x'], 'y': args['y']} | |
users[user_id] = user | |
return user, 201 | |
def delete(self, user_id): | |
abort_if_user_not_exists(user_id) | |
del users[user_id] | |
return '', 204 | |
class FakePostGIS(object): | |
def _coord_power(self, a, b): | |
value = a - b if a > b else b - a | |
return math.pow(value, 2) | |
def by_distance(self, user_id, value): | |
user = users[user_id] | |
x1, y1 = user['x'], user['y'] | |
result = {} | |
for key, item in users.items(): | |
if key == user_id: | |
continue | |
x2, y2 = item['x'], item['y'] | |
xdiff = self._coord_power(x2, x1) | |
ydiff = self._coord_power(y2, y1) | |
distance = math.sqrt(xdiff + ydiff) | |
item.update({'distance': distance}) | |
if value > distance: | |
result[key] = item | |
return result | |
class UserSearch(Resource): | |
def __init__(self): | |
self.gis = FakePostGIS() | |
def get(self, user_id, distance): | |
abort_if_user_not_exists(user_id) | |
return self.gis.by_distance(user_id, float(distance)) | |
api.add_resource(UserList, '/') | |
api.add_resource(User, '/user/<int:user_id>') | |
api.add_resource(UserSearch, '/search/<int:user_id>/<distance>') | |
if __name__ == '__main__': | |
app.run(debug=True) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment