Skip to content

Instantly share code, notes, and snippets.

@RaD
Created September 15, 2016 06:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RaD/80cdd5a835643a23237f2abd2cdfbb65 to your computer and use it in GitHub Desktop.
Save RaD/80cdd5a835643a23237f2abd2cdfbb65 to your computer and use it in GitHub Desktop.
Simple RESTful service on Flask with CRUD and GIS
# 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