Browse Source

API-Hour FrameworkBenchmark: Implement test 4: Fortunes WIP

Ludovic Gasc (GMLudo) 10 years ago
parent
commit
8f881bf9ac

+ 1 - 0
frameworks/Python/API-Hour/benchmark_config

@@ -6,6 +6,7 @@
       "json_url": "/json",
       "json_url": "/json",
       "db_url": "/db",
       "db_url": "/db",
       "query_url": "/queries?queries=",
       "query_url": "/queries?queries=",
+      "fortune_url": "/fortunes",
       "update_url": "/updates?queries=",
       "update_url": "/updates?queries=",
       "plaintext_url": "/plaintext",
       "plaintext_url": "/plaintext",
       "port": 8008,
       "port": 8008,

+ 4 - 1
frameworks/Python/API-Hour/hello/hello/__init__.py

@@ -3,9 +3,10 @@ import asyncio
 import os
 import os
 
 
 import aiopg
 import aiopg
+import jinja2
 import psycopg2.extras
 import psycopg2.extras
 import aiohttp.web
 import aiohttp.web
-
+import aiohttp_jinja2
 import api_hour
 import api_hour
 
 
 from . import endpoints
 from . import endpoints
@@ -19,11 +20,13 @@ class Container(api_hour.Container):
         super().__init__(*args, **kwargs)
         super().__init__(*args, **kwargs)
         # Servers
         # Servers
         self.servers['http'] = aiohttp.web.Application(loop=kwargs['loop'])
         self.servers['http'] = aiohttp.web.Application(loop=kwargs['loop'])
+        aiohttp_jinja2.setup(self.servers['http'], loader=jinja2.PackageLoader('hello'))
         self.servers['http'].ah_container = self # keep a reference to Container
         self.servers['http'].ah_container = self # keep a reference to Container
         # routes
         # routes
         self.servers['http'].router.add_route('GET', '/json', endpoints.world.json)
         self.servers['http'].router.add_route('GET', '/json', endpoints.world.json)
         self.servers['http'].router.add_route('GET', '/db', endpoints.world.db)
         self.servers['http'].router.add_route('GET', '/db', endpoints.world.db)
         self.servers['http'].router.add_route('GET', '/queries', endpoints.world.queries)
         self.servers['http'].router.add_route('GET', '/queries', endpoints.world.queries)
+        self.servers['http'].router.add_route('GET', '/fortunes', endpoints.world.fortunes)
         self.servers['http'].router.add_route('GET', '/updates', endpoints.world.updates)
         self.servers['http'].router.add_route('GET', '/updates', endpoints.world.updates)
         self.servers['http'].router.add_route('GET', '/plaintext', endpoints.world.plaintext)
         self.servers['http'].router.add_route('GET', '/plaintext', endpoints.world.plaintext)
 
 

+ 11 - 1
frameworks/Python/API-Hour/hello/hello/endpoints/world.py

@@ -3,9 +3,10 @@ import asyncio
 
 
 from aiohttp.web import Response
 from aiohttp.web import Response
 from api_hour.plugins.aiohttp import JSON
 from api_hour.plugins.aiohttp import JSON
+import aiohttp_jinja2
 
 
 from ..services import queries_number
 from ..services import queries_number
-from ..services.world import get_random_record, get_random_records, update_random_records
+from ..services.world import get_random_record, get_random_records, update_random_records, get_fortunes
 
 
 LOG = logging.getLogger(__name__)
 LOG = logging.getLogger(__name__)
 
 
@@ -29,6 +30,15 @@ def queries(request):
 
 
     return JSON((yield from get_random_records(container, limit)))
     return JSON((yield from get_random_records(container, limit)))
 
 
[email protected]
+def fortunes(request):
+    """Test type 4: Fortunes"""
+    container = request.app.ah_container
+
+    return aiohttp_jinja2.render_template('fortunes.html.j2',
+                                          request,
+                                          {'fortunes': (yield from get_fortunes(container))})
+
 @asyncio.coroutine
 @asyncio.coroutine
 def updates(request):
 def updates(request):
     """Test type 5: Database updates"""
     """Test type 5: Database updates"""

+ 11 - 1
frameworks/Python/API-Hour/hello/hello/services/world.py

@@ -42,4 +42,14 @@ def update_random_records(container, limit):
     yield from asyncio.wait(tasks)
     yield from asyncio.wait(tasks)
     for task in tasks:
     for task in tasks:
         results.append(task.result())
         results.append(task.result())
-    return results
+    return results
+
[email protected]
+def get_fortunes(container):
+    pg = yield from container.engines['pg']
+
+    with (yield from pg.cursor()) as cur:
+        yield from cur.execute('SELECT * FROM fortune')
+        fortunes = yield from cur.fetchall()
+
+    return fortunes

+ 20 - 0
frameworks/Python/API-Hour/hello/hello/templates/fortunes.html.j2

@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>Fortunes</title>
+</head>
+<body>
+<table>
+    <tr>
+        <th>id</th>
+        <th>message</th>
+    </tr>
+    {% for fortune in fortunes %}
+        <tr>
+            <td>{{ fortune['id'] }}</td>
+            <td>{{ fortune['message'] }}</td>
+        </tr>
+    {% endfor %}
+</table>
+</body>
+</html>