Created
August 3, 2012 04:15
-
-
Save markchadwick/3244280 to your computer and use it in GitHub Desktop.
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
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