Created
July 1, 2012 00:38
-
-
Save kennethlove/3026229 to your computer and use it in GitHub Desktop.
redbeard2 flask app
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
""" | |
TODO | |
""" | |
__author__ = "Chris Jones, Kenneth Love" | |
__version__ = "0.8.5" | |
__license__ = "MIT" | |
from flask import Flask, render_template, request, session | |
from flask.views import MethodView | |
import redis | |
from redis.exceptions import ConnectionError, ResponseError | |
import settings | |
SECRET_KEY = "781ba680hf13493089a6ffafac755a61" | |
app = Flask(__name__) | |
app.config.from_object(__name__) | |
app.debug = True | |
class Key(object): | |
def __init__(self, *args, **kwargs): | |
self.type = kwargs.get("type") | |
self.id = kwargs.get("id") | |
self.value = kwargs.get("value") | |
class KeyAPI(MethodView): | |
template_name = "detail.html" | |
def _get_key(self, key_id): | |
r = get_redis_connection(session) | |
key_type = r.type(key_id) | |
if key_type == "string": | |
value = r.get(key_id) | |
return Key(type="string", id=key_id, value=value) | |
elif key_type == "hash": | |
value = r.hgetall(key_id) | |
return Key(type="hash", id=key_id, value=value) | |
elif key_type == "list": | |
value = r.lrange(key_id, 0, r.llen(key_id)) | |
return Key(type="list", id=key_id, value=value) | |
elif key_type == "set": | |
value = r.smembers(key_id) | |
return Key(type="set", id=key_id, value=value) | |
elif key_type == "zset": | |
value = r.zrange(key_id, 0, r.zcard(key_id), "WITHSCORES") | |
return Key(type="zset", id=key_id, value=value) | |
else: | |
return None | |
def _get_keys(self): | |
r = get_redis_connection(session) | |
r_keys = r.keys("*") | |
return [self._get_key(k) for k in r_keys] | |
def get(self, key_id): | |
key = None | |
if key_id: | |
key = self._get_key(key_id) | |
return render_template(self.template_name, key=key) | |
else: | |
keys = self._get_keys() | |
return render_template("list.html", keys=keys) | |
def post(self, key_id): | |
return render_template(self.template_name) | |
key_view = KeyAPI.as_view("key_view") | |
app.add_url_rule("/keys/", defaults={"key_id": None}, view_func=key_view, | |
methods=["GET"]) | |
app.add_url_rule("/keys/", view_func=key_view, methods=["POST"]) | |
app.add_url_rule("/keys/<string:key_id>", view_func=key_view, | |
methods=["GET", "PUT", "DELETE"]) | |
# Control app flow | |
def get_redis_connection(session): | |
""" | |
Get Redis connection with session values. Ping Redis | |
to make sure connection is working. | |
""" | |
r = redis.Redis( | |
host=session.get("redis_host", settings.REDIS_HOST), | |
port=session.get("redis_port", settings.REDIS_PORT), | |
db=session.get("redis_db", settings.REDIS_DB), | |
password=session.get("redis_password", '')) | |
try: | |
r.ping() | |
except (ConnectionError, ResponseError): | |
return None | |
return r | |
def set_session_defaults(session): | |
""" Setup default session """ | |
session["redis_db"] = settings.REDIS_DB | |
session["redis_host"] = settings.REDIS_HOST | |
session["redis_port"] = settings.REDIS_PORT | |
def index(): | |
if "redis_db" not in session: | |
set_session_defaults(session) | |
get_redis_connection(session) | |
return render_template("index.html") | |
app.add_url_rule("/", view_func=index) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment