Browse Source

klein: Close SQLAlchemy's session for each request

INADA Naoki 10 năm trước cách đây
mục cha
commit
9e4bd9a772
1 tập tin đã thay đổi với 51 bổ sung33 xóa
  1. 51 33
      frameworks/Python/klein/app.py

+ 51 - 33
frameworks/Python/klein/app.py

@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from functools import partial
+from functools import partial, wraps
 import json
 from operator import attrgetter
 import os
@@ -31,6 +31,7 @@ env = Environment(loader=PackageLoader("app", "templates"), autoescape=True, aut
 
 app = Klein()
 
+
 class Fortune(Base):
     __tablename__ = "Fortune"
     id = Column(Integer, primary_key=True)
@@ -63,55 +64,72 @@ def getQueryNum(queryString):
     except ValueError:
          return 1
 
+
+def close_session(func):
+    @wraps(func)
+    def wrapper(request):
+        try:
+            return func(request)
+        finally:
+            db_session.close()
+    return wrapper
+
+
 @app.route("/plaintext")
 def plaintext(request):
-	request.setHeader("Content-Type", "text/plain; charset=UTF-8")
-	return "Hello, World!"
+    request.setHeader("Content-Type", "text/plain; charset=UTF-8")
+    return "Hello, World!"
 
 @app.route("/json")
 def jsonHandler(request):
-	request.setHeader("Content-Type", "application/json; charset=UTF-8")
-	return json.dumps({"message": "Hello, World!"})
+    request.setHeader("Content-Type", "application/json; charset=UTF-8")
+    return json.dumps({"message": "Hello, World!"})
 
 @app.route("/db")
+@close_session
 def db(request):
-	request.setHeader("Content-Type", "application/json; charset=UTF-8")	
-	wid = randint(1, 10000)
-	world = db_session.query(World).get(wid).serialize() 
-	return json.dumps(world)
+    request.setHeader("Content-Type", "application/json; charset=UTF-8")
+    wid = randint(1, 10000)
+    world = db_session.query(World).get(wid).serialize()
+    return json.dumps(world)
 
 @app.route("/queries")
+@close_session
 def queries(request):
-	request.setHeader("Content-Type", "application/json; charset=UTF-8")	
-	num_queries = getQueryNum(request.args.get("queries")[0])
-	rp = partial(randint, 1, 10000)
-	get = db_session.query(World).get
-	worlds = [get(rp()).serialize() for _ in xrange(num_queries)]
-	return json.dumps(worlds)
+    request.setHeader("Content-Type", "application/json; charset=UTF-8")
+    num_queries = getQueryNum(request.args.get("queries")[0])
+    rp = partial(randint, 1, 10000)
+    get = db_session.query(World).get
+    worlds = [get(rp()).serialize() for _ in xrange(num_queries)]
+    return json.dumps(worlds)
 
 @app.route("/updates")
+@close_session
 def updates(request):
-	request.setHeader("Content-Type", "application/json; charset=UTF-8")
-	num_queries = getQueryNum(request.args.get("queries")[0])
-	worlds = []
-	rp = partial(randint, 1, 10000)
-	ids = [rp() for _ in xrange(num_queries)]
-	ids.sort()
-	for id in ids:
-		world = db_session.query(World).get(id)
-		world.randomNumber = rp()
-		worlds.append(world.serialize())
-	db_session.commit()
-	return json.dumps(worlds)
+    request.setHeader("Content-Type", "application/json; charset=UTF-8")
+    num_queries = getQueryNum(request.args.get("queries")[0])
+    worlds = []
+    rp = partial(randint, 1, 10000)
+    ids = [rp() for _ in xrange(num_queries)]
+    ids.sort()
+    for id in ids:
+        world = db_session.query(World).get(id)
+        world.randomNumber = rp()
+        worlds.append(world.serialize())
+    db_session.commit()
+    return json.dumps(worlds)
 
 @app.route("/fortune")
+@close_session
 def fortune(request):
-	request.setHeader("Content-Type", "text/html; charset=UTF-8")
-	fortunes = db_session.query(Fortune).all()
-	fortunes.append(Fortune(id=0, message="Additional fortune added at request time."))
-	fortunes.sort(key=attrgetter("message"))
-	template = env.get_template("fortunes.html")
-	return template.render(fortunes=fortunes)
+    request.setHeader("Content-Type", "text/html; charset=UTF-8")
+    fortunes = db_session.query(Fortune).all()
+    fortunes.append(Fortune(id=0, message="Additional fortune added at request time."))
+    fortunes.sort(key=attrgetter("message"))
+    template = env.get_template("fortunes.html")
+    return template.render(fortunes=fortunes)
 
 if __name__ == "__main__":
     app.run("0.0.0.0", 8080)
+
+# vim: set expandtab sw=4 sts=4 ts=4 :