Browse Source

implements db, queries, updates, and fortune for wheezy.web

Keith Newman 10 years ago
parent
commit
7793e443ed

+ 13 - 0
frameworks/Python/wheezyweb/README.md

@@ -22,3 +22,16 @@ http://localhost:8080/json
 ### Plaintext
 
 http://localhost:8080/plaintext
+
+### DB
+
+http://localhost:8080/db
+
+
+### Query
+
+http://localhost:8080/queries?queries=2
+
+### Update
+
+http://localhost:8080/updates?queries=2

+ 122 - 0
frameworks/Python/wheezyweb/app-backup.py

@@ -0,0 +1,122 @@
+import os
+import sys
+from functools import partial
+from operator import attrgetter
+from random import randint
+
+from wheezy.http import HTTPResponse
+from wheezy.http import WSGIApplication
+from wheezy.routing import url
+from wheezy.web.handlers import BaseHandler
+from wheezy.web.middleware import bootstrap_defaults
+from wheezy.web.middleware import path_routing_middleware_factory
+
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy import create_engine, Column
+from sqlalchemy.types import String, Integer
+from sqlalchemy.orm import sessionmaker
+
+DBDRIVER = 'mysql'
+DBHOSTNAME = os.environ.get('DBHOST', 'localhost')
+DATABASE_URI = '%s://benchmarkdbuser:benchmarkdbpass@%s:3306/hello_world?charset=utf8' % (DBDRIVER, DBHOSTNAME)
+
+Base = declarative_base()
+db_engine = create_engine(DATABASE_URI)
+Session = sessionmaker(bind=db_engine)
+db_session = Session()
+
+if sys.version_info[0] == 3:
+	xrange = range
+
+def getQueryNum(queryString):
+	try:
+		int(queryString)
+		return int(queryString)
+	except ValueError:
+		return 1
+
+class World(Base):
+	__tablename__ = "World"
+	id = Column(Integer, primary_key=True)
+	randomNumber = Column(Integer)
+	def serialize(self):
+		return {
+			'id': self.id,
+			'randomNumber': self.randomNumber,
+		}
+
+class JsonHandler(BaseHandler):
+	def get(self):
+		return self.json_response({"message": "Hello, world!"})
+
+class DbHandler(BaseHandler):
+	def get(self):
+		db_engine.connect()
+		wid = randint(1, 10000)
+		world = db_session.query(World).get(wid).serialize()
+		return self.json_response(world)
+
+class QueriesHandler(BaseHandler):
+	def get(self):
+		queries = self.request.get_param("queries")
+		num_queries = getQueryNum(queries)
+		if num_queries < 1:
+			num_queries = 1
+		if num_queries > 500:
+			num_queries = 500
+		rp = partial(randint, 1, 10000)
+		get = db_session.query(World).get
+		worlds = [get(rp()).serialize() for _ in xrange(num_queries)]
+		return self.json_response(worlds)
+
+class UpdatesHandler(BaseHandler):
+	def get(self):
+		queries = self.request.get_param("queries")
+		num_queries = getQueryNum(queries)
+		if num_queries < 1:
+			num_queries = 1
+		if num_queries > 500:
+			num_queries = 500
+		worlds = []
+		rp = partial(randint, 1, 10000)
+		ids = [rp() for _ in xrange(num_queries)]
+		ids.sort() # To avoid deadlock
+		for id in ids:
+			world = db_session.query(World).get(id)
+			world.randomNumber = rp()
+			worlds.append(world.serialize())
+		return self.json_response(worlds)
+
+def plaintext(request):
+	response = HTTPResponse()
+	response.write("Hello, world!")
+	return response
+
+all_urls = [
+	url("plaintext", plaintext, name="plaintext"),
+	url("json", JsonHandler, name="json"),
+	url("db", DbHandler, name="db"),
+	url("queries", QueriesHandler, name="queries"),
+	url("updates", UpdatesHandler, name="updates")
+
+
+]
+
+options = {}
+
+main = WSGIApplication(
+	middleware = [
+		bootstrap_defaults(url_mapping=all_urls),
+		path_routing_middleware_factory
+	],
+	options = options
+)
+
+if __name__ == "__main__":
+	from wsgiref.simple_server import make_server
+	try:
+		print("Server started on http://localhost:8080")
+		make_server("", 8080, main).serve_forever()
+	except KeyboardInterrupt:
+		pass
+	print("\nStopping server...")

+ 132 - 17
frameworks/Python/wheezyweb/app.py

@@ -1,3 +1,10 @@
+import os
+import sys
+from functools import partial
+from operator import attrgetter
+from random import randint
+
+import bleach
 
 from wheezy.http import HTTPResponse
 from wheezy.http import WSGIApplication
@@ -6,34 +13,142 @@ from wheezy.web.handlers import BaseHandler
 from wheezy.web.middleware import bootstrap_defaults
 from wheezy.web.middleware import path_routing_middleware_factory
 
+from wheezy.template.engine import Engine
+from wheezy.template.ext.core import CoreExtension
+from wheezy.template.loader import FileLoader
+
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy import create_engine, Column
+from sqlalchemy.types import String, Integer, Unicode
+from sqlalchemy.orm import sessionmaker
+
+DBDRIVER = 'mysql'
+DBHOSTNAME = os.environ.get('DBHOST', 'localhost')
+DATABASE_URI = '%s://benchmarkdbuser:benchmarkdbpass@%s:3306/hello_world?charset=utf8' % (DBDRIVER, DBHOSTNAME)
+
+Base = declarative_base()
+db_engine = create_engine(DATABASE_URI)
+Session = sessionmaker(bind=db_engine)
+db_session = Session()
+
+if sys.version_info[0] == 3:
+	xrange = range
+
+def getQueryNum(queryString):
+	try:
+		int(queryString)
+		return int(queryString)
+	except ValueError:
+		return 1
+
+class Fortune(Base):
+	__tablename__ = "Fortune"
+	id = Column(Integer, primary_key=True)
+	message = Column(String)
+
+	def serialize(self):
+		return {
+			'id': self.id,
+			'randomNumber': self.randomNumber,
+		}
+
+class World(Base):
+	__tablename__ = "World"
+	id = Column(Integer, primary_key=True)
+	randomNumber = Column(Integer)
+	def serialize(self):
+		return {
+			'id': self.id,
+			'randomNumber': self.randomNumber,
+		}
+
 class JsonHandler(BaseHandler):
+	def get(self):
+		return self.json_response({"message": "Hello, world!"})
+
+class DbHandler(BaseHandler):
+	def get(self):
+		db_engine.connect()
+		wid = randint(1, 10000)
+		world = db_session.query(World).get(wid).serialize()
+		return self.json_response(world)
+
+class QueriesHandler(BaseHandler):
+	def get(self):
+		queries = self.request.get_param("queries")
+		num_queries = getQueryNum(queries)
+		if num_queries < 1:
+			num_queries = 1
+		if num_queries > 500:
+			num_queries = 500
+		rp = partial(randint, 1, 10000)
+		get = db_session.query(World).get
+		worlds = [get(rp()).serialize() for _ in xrange(num_queries)]
+		return self.json_response(worlds)
 
-  def get(self):
-    return self.json_response({"message": "Hello, world!"})
+class UpdatesHandler(BaseHandler):
+	def get(self):
+		queries = self.request.get_param("queries")
+		num_queries = getQueryNum(queries)
+		if num_queries < 1:
+			num_queries = 1
+		if num_queries > 500:
+			num_queries = 500
+		worlds = []
+		rp = partial(randint, 1, 10000)
+		ids = [rp() for _ in xrange(num_queries)]
+		ids.sort() # To avoid deadlock
+		for id in ids:
+			world = db_session.query(World).get(id)
+			world.randomNumber = rp()
+			worlds.append(world.serialize())
+		return self.json_response(worlds)
+
+class FortuneHandler(BaseHandler):
+	def get(self):
+		fortunes = db_session.query(Fortune).all()
+		fortunes.append(Fortune(id=0, message="Additional fortune added at request time."))
+		fortunes.sort(key=attrgetter("message"))
+		engine = Engine(loader=FileLoader(["views"]), extensions=[CoreExtension()])
+		template = engine.get_template("fortune.html")
+		for f in fortunes:
+			f.message = bleach.clean(f.message)
+		template_html = template.render({"fortunes": fortunes})		
+
+		response = HTTPResponse()
+		response.write(template_html)
+		return response
 
 def plaintext(request):
-  response = HTTPResponse()
-  response.write("Hello, world!")
-  return response
+	response = HTTPResponse()
+	response.write("Hello, world!")
+	return response
 
 all_urls = [
-  url("plaintext", plaintext, name="plaintext"),
-  url("json", JsonHandler, name="json")
+	url("plaintext", plaintext, name="plaintext"),
+	url("json", JsonHandler, name="json"),
+	url("db", DbHandler, name="db"),
+	url("queries", QueriesHandler, name="queries"),
+	url("updates", UpdatesHandler, name="updates"),
+	url("fortune", FortuneHandler, name="fortune")
+
 ]
 
 options = {}
 
 main = WSGIApplication(
-  middleware = [
-    bootstrap_defaults(url_mapping=all_urls),
-    path_routing_middleware_factory
-  ],
-  options = options
+	middleware = [
+		bootstrap_defaults(url_mapping=all_urls),
+		path_routing_middleware_factory
+	],
+	options = options
 )
 
 if __name__ == "__main__":
-  from wsgiref.simple_server import make_server
-  try:
-    make_server("", 8080, main).serve_forever()
-  except KeyboardInterrupt:
-    pass
+	from wsgiref.simple_server import make_server
+	try:
+		print("Server started on http://localhost:8080")
+		make_server("", 8080, main).serve_forever()
+	except KeyboardInterrupt:
+		pass
+	print("\nStopping server...")

+ 12 - 4
frameworks/Python/wheezyweb/benchmark_config

@@ -4,14 +4,18 @@
     "default": {
       "setup_file": "setup",
       "json_url": "/json",
+      "db_url": "/db",
+      "query_url": "/queries?queries=",
+      "fortune_url": "/fortune",
+      "update_url": "/updates?queries=",
       "plaintext_url": "/plaintext",
       "port": 8080,
       "approach": "Realistic",
       "classification": "Micro",
-      "database": "None",
+      "database": "MySQL",
       "framework": "wheezy.web",
       "language": "Python",
-      "orm": "Raw",
+      "orm": "Full",
       "platform": "wheezy.web",
       "webserver": "None",
       "os": "Linux",
@@ -22,14 +26,18 @@
     "py3": {
       "setup_file": "setup_py3",
       "json_url": "/json",
+      "db_url": "/db",
+      "query_url": "/queries?queries=",
+      "fortune_url": "/fortune",
+      "update_url": "/updates?queries=",
       "plaintext_url": "/plaintext",
       "port": 8080,
       "approach": "Realistic",
       "classification": "Micro",
-      "database": "None",
+      "database": "MySQL",
       "framework": "wheezy.web",
       "language": "Python",
-      "orm": "Raw",
+      "orm": "Full",
       "platform": "wheezy.web",
       "webserver": "None",
       "os": "Linux",

+ 5 - 0
frameworks/Python/wheezyweb/requirements.txt

@@ -1 +1,6 @@
 wheezy.web==0.1.469
+wheezy.template==0.1.159
+bleach==1.4.1
+SQLAlchemy==0.9.9
+mysqlclient==1.3.6
+

+ 22 - 0
frameworks/Python/wheezyweb/views/fortune.html

@@ -0,0 +1,22 @@
+@require(fortunes)
+<!DOCTYPE html>
+<html>
+<head>
+<title>Fortunes</title>
+</head>
+<body>
+<table>
+<tr>
+<th>id</th>
+<th>message</th>
+</tr>
+@for fortune in fortunes:
+<tr>
+<td>@str(fortune.id)</td>
+<td>@fortune.message</td>
+</tr>
+@end
+</table>
+</body>
+</html>
+