Эх сурвалжийг харах

improvements for pyramid framework (#4904)

Sergey Maranchuk 6 жил өмнө
parent
commit
a65df4dccb

+ 0 - 3
frameworks/Python/pyramid/frameworkbenchmarks/__init__.py

@@ -2,16 +2,13 @@
 App config and initialization.
 App config and initialization.
 """
 """
 
 
-from pyramid.request import Request
 from pyramid.config import Configurator
 from pyramid.config import Configurator
-from frameworkbenchmarks.models import sqlalchemy_encoder_factory
 
 
 
 
 def main(global_config, **settings):
 def main(global_config, **settings):
     """ This function returns a Pyramid WSGI application.
     """ This function returns a Pyramid WSGI application.
     """
     """
     config = Configurator(settings=settings)
     config = Configurator(settings=settings)
-    config.add_renderer('sqla_json', sqlalchemy_encoder_factory)
     config.include('pyramid_chameleon')
     config.include('pyramid_chameleon')
     config.add_route('test_1', '/json')
     config.add_route('test_1', '/json')
     config.add_route('test_2', '/db')
     config.add_route('test_2', '/db')

+ 1 - 18
frameworks/Python/pyramid/frameworkbenchmarks/models.py

@@ -30,23 +30,6 @@ metadata = MetaData()
 DatabaseBase = declarative_base()
 DatabaseBase = declarative_base()
 
 
 
 
-def sqlalchemy_encoder_factory(system_values):
-    return SQLAlchemyEncoder()
-
-
-class SQLAlchemyEncoder(json.JSONEncoder):
-    def __call__(self, obj, system_values):
-        if isinstance(obj, Iterable):
-            return json.dumps([self.default(x) for x in obj])
-        else:
-            return json.dumps(self.default(obj))
-
-    def default(self, obj):
-        if isinstance(obj.__class__, DeclarativeMeta):
-            return obj.__json__()
-        return super(SQLAlchemyEncoder, self).default(obj)
-
-
 class World(DatabaseBase):
 class World(DatabaseBase):
     __tablename__ = 'world'
     __tablename__ = 'world'
 
 
@@ -54,7 +37,7 @@ class World(DatabaseBase):
     randomNumber = Column(
     randomNumber = Column(
         'randomnumber', Integer, nullable=False, server_default='0')
         'randomnumber', Integer, nullable=False, server_default='0')
 
 
-    def __json__(self):
+    def __json__(self, request=None):
         return {'id': self.id, 'randomNumber': self.randomNumber}
         return {'id': self.id, 'randomNumber': self.randomNumber}
 
 
 
 

+ 28 - 16
frameworks/Python/pyramid/frameworkbenchmarks/views.py

@@ -2,11 +2,19 @@
 Test views, per the spec here:
 Test views, per the spec here:
     http://www.techempower.com/benchmarks/#section=code&hw=i7&test=json
     http://www.techempower.com/benchmarks/#section=code&hw=i7&test=json
 """
 """
-
+from operator import itemgetter
 from random import randint
 from random import randint
+import sys
+
 from pyramid.view import view_config
 from pyramid.view import view_config
 from pyramid.response import Response
 from pyramid.response import Response
 from frameworkbenchmarks.models import DBSession, World, Fortune
 from frameworkbenchmarks.models import DBSession, World, Fortune
+from sqlalchemy.ext import baked
+
+if sys.version_info[0] == 3:
+    xrange = range
+
+bakery = baked.bakery()
 
 
 
 
 @view_config(route_name='test_1', renderer='json')
 @view_config(route_name='test_1', renderer='json')
@@ -14,7 +22,7 @@ def test_1(request):
     """
     """
     Test type 1: JSON serialization
     Test type 1: JSON serialization
     """
     """
-    return {"message":"Hello, World!"}
+    return {"message": "Hello, World!"}
 
 
 
 
 @view_config(route_name='test_2', renderer='json')
 @view_config(route_name='test_2', renderer='json')
@@ -23,7 +31,8 @@ def test_2(request):
     Test type 2: Single database query
     Test type 2: Single database query
     """
     """
     num = randint(1, 10000)
     num = randint(1, 10000)
-    result = DBSession.query(World).filter(World.id == num).one()
+    baked_query = bakery(lambda session: session.query(World))
+    result = baked_query(DBSession).get(num)
     return result.__json__()
     return result.__json__()
 
 
 
 
@@ -32,7 +41,7 @@ def test_3(request):
     """
     """
     Test type 3: Multiple database queries
     Test type 3: Multiple database queries
     """
     """
-    queries = request.params['queries']
+    queries = request.GET.get('queries', 1)
     try:
     try:
         queries = int(queries)
         queries = int(queries)
     except ValueError:
     except ValueError:
@@ -42,11 +51,12 @@ def test_3(request):
             queries = 1
             queries = 1
         elif queries > 500:
         elif queries > 500:
             queries = 500
             queries = 500
+    baked_query = bakery(lambda session: session.query(World))
     result = [
     result = [
-        DBSession.query(World).filter(World.id == num).one()
-        for num in [randint(1, 10000) for _ in range(1, queries + 1)]
+        baked_query(DBSession).get(num).__json__()
+        for num in (randint(1, 10000) for _ in xrange(queries))
     ]
     ]
-    return [obj.__json__() for obj in result]
+    return result
 
 
 
 
 @view_config(route_name='test_4', renderer='templates/test_4.pt')
 @view_config(route_name='test_4', renderer='templates/test_4.pt')
@@ -54,11 +64,14 @@ def test_4(request):
     """
     """
     Test type 4: Fortunes
     Test type 4: Fortunes
     """
     """
-    fortunes = [obj.__json__() for obj in DBSession.query(Fortune).all()]
+    baked_query = bakery(lambda session: session.query(Fortune))
+
+    fortunes = [obj.__json__() for obj in baked_query(DBSession).all()]
     fortunes.append(
     fortunes.append(
         {"id": 0, "message": "Additional fortune added at request time."}
         {"id": 0, "message": "Additional fortune added at request time."}
     )
     )
-    return {'fortunes': sorted(fortunes, key=lambda x: x['message'])}
+    fortunes.sort(key=itemgetter('message'))
+    return {'fortunes': fortunes}
 
 
 
 
 @view_config(route_name='test_5', renderer='json')
 @view_config(route_name='test_5', renderer='json')
@@ -66,7 +79,7 @@ def test_5(request):
     """
     """
     Test type 5: Database updates
     Test type 5: Database updates
     """
     """
-    queries = request.params['queries']
+    queries = request.GET.get('queries', 1)
     try:
     try:
         queries = int(queries)
         queries = int(queries)
     except ValueError:
     except ValueError:
@@ -76,13 +89,12 @@ def test_5(request):
             queries = 1
             queries = 1
         elif queries > 500:
         elif queries > 500:
             queries = 500
             queries = 500
-    objset = [
-        DBSession.query(World).filter(World.id == num).one()
-        for num in [randint(1, 10000) for _ in range(1, queries + 1)]
-    ]
-    for obj in objset:
+    baked_query = bakery(lambda session: session.query(World))
+    resultset = []
+    for num in sorted(randint(1, 10000) for _ in xrange(queries)):
+        obj = baked_query(DBSession).get(num)
         obj.randomNumber = randint(1, 10000)
         obj.randomNumber = randint(1, 10000)
-    resultset = [obj.__json__() for obj in objset]
+        resultset.append(obj.__json__())
     DBSession.commit()
     DBSession.commit()
     return resultset
     return resultset
 
 

+ 2 - 2
frameworks/Python/pyramid/requirements.txt

@@ -1,7 +1,7 @@
-psycopg2==2.8.2
+psycopg2==2.8.3
 gunicorn==19.9.0
 gunicorn==19.9.0
 meinheld==1.0.1
 meinheld==1.0.1
-SQLAlchemy==1.3.4
+SQLAlchemy==1.3.5
 pyramid==1.10.4
 pyramid==1.10.4
 pyramid_chameleon==0.3
 pyramid_chameleon==0.3
 greenlet==0.4.15
 greenlet==0.4.15