Skip to content

Instantly share code, notes, and snippets.

@markchadwick
Created August 3, 2012 04:15
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 markchadwick/3244280 to your computer and use it in GitHub Desktop.
Save markchadwick/3244280 to your computer and use it in GitHub Desktop.
import os
import errno
import json
from base64 import urlsafe_b64encode
from flask import Flask
from flask import Response
from flask import abort
from flask import request
from flask import session
from uuid import uuid4
ROOT = '/tmp/footrest'
app = Flask(__name__)
# -----------------------------------------------------------------------------
# Session Handling
# -----------------------------------------------------------------------------
@app.route('/session/')
def get_session():
session.get('user') or abort(403)
return Response(status=200, mimetype='application/json',
response=json.dumps(session['user']))
@app.route('/session/', methods=['POST'])
def create_session():
user = request.json
del user['password']
user['name'] = user.get('email', 'Vistar')
session['user'] = user
return Response(status=201, mimetype='application/json',
response=json.dumps(user))
@app.route('/session/', methods=['DELETE'])
def logout():
del session['user']
return Response(status=204)
# -----------------------------------------------------------------------------
# Cross-Origin foolery
# -----------------------------------------------------------------------------
@app.after_request
def add_cords_headers(response):
origin = request.headers.get('Origin', '*')
response.headers['Access-Control-Allow-Origin'] = origin
response.headers['Access-Control-Allow-Credentials'] = 'true'
response.headers['Access-Control-Allow-Headers'] = 'Content-Type, *'
response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE'
return response
# -----------------------------------------------------------------------------
# Catch-allz
# -----------------------------------------------------------------------------
@app.route('/')
def root():
return get('')
@app.route('/<path:path>', methods=['GET'])
def get(path):
root = os.path.join(ROOT, path)
if os.path.isdir(root):
return json.dumps(list_root(root))
if os.path.isfile(root):
return json.dumps(cat(root))
# Just assume it's some empty resource
else:
return Response(response='[]', mimetype='application/json')
abort(404)
@app.route('/<path:path>', methods=['POST'])
def create(path):
root = os.path.join(ROOT, path)
id = new_id()
makedirs(root)
with open(os.path.join(root, id), 'w') as f:
model = request.json
model['id'] = id
json.dump(model, f)
return json_response(model, 201)
@app.route('/<path:path>', methods=['PUT'])
def update(path):
root = os.path.join(ROOT, path)
if not os.path.isfile(root):
abort(404)
model = None
with open(root, 'r') as f:
model = json.load(f)
model.update(request.json)
with open(root, 'w') as f:
json.dump(model, f)
return json_response(model)
@app.route('/<path:path>', methods=['DELETE'])
def delete(path):
root = os.path.join(ROOT, path)
if not os.path.isfile(root):
abort(404)
os.remove(root)
return Response(status=204)
def list_root(root):
contents = []
for local in os.listdir(root):
file_name = os.path.join(root, local)
if os.path.isfile(file_name) and not local.startswith('.'):
contents.append(cat(file_name))
return contents
def new_id():
return urlsafe_b64encode(uuid4().bytes).replace('=', '')
def cat(path):
with open(path) as input:
return json.load(input)
def json_response(body, status=200):
body = json.dumps(body)
return Response(status=status, mimetype='application/json', response=body)
def makedirs(path):
try:
os.makedirs(path)
except OSError as exc:
if exc.errno == errno.EEXIST: pass
else: raise
# -----------------------------------------------------------------------------
# MAIN
# -----------------------------------------------------------------------------
if __name__ == '__main__':
makedirs(ROOT)
app.secret_key = 'Perhaps not surpsingly, smoke weed every day'
app.run(debug=True, port=5001)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment