2016-03-21 3 views
-1

Ich habe eine riesige Tornado-App, die in einer blockierenden Weise geschrieben wurde. Ich versuche, meine DB-Aufrufe zu Async zu konvertieren. Ich habe viele Probleme.Warum löst der mongodb-Motor die Daten nicht korrekt auf?

Ich halte die Mongo-Aufrufe in einem Top-Level-Ordner namens lib und im App-Ordner behalte ich alle meine Ansichten.

Der Fehler i

immer bin
Traceback (most recent call last): 
    File "/Users/marcsantiago/staging_env/lib/python2.7/site-packages/tornado/web.py", line 1445, in _execute 
    result = yield result 
    File "/Users/marcsantiago/staging_env/lib/python2.7/site-packages/tornado/gen.py", line 1008, in run 
    value = future.result() 
    File "/Users/marcsantiago/staging_env/lib/python2.7/site-packages/tornado/concurrent.py", line 232, in result 
    raise_exc_info(self._exc_info) 
    File "/Users/marcsantiago/staging_env/lib/python2.7/site-packages/tornado/gen.py", line 1017, in run 
    yielded = self.gen.send(value) 
    File "/Users/marcsantiago/pubgears/app/admin.py", line 179, in get 
    notes, start_date, stats, last_updated = self.db_data() 
    File "/Users/marcsantiago/pubgears/app/admin.py", line 76, in db_data 
    while (yield chain_slugs_updated.fetch_next): 
AttributeError: 'NoneType' object has no attribute 'fetch_next' 

So in dem Ordner lib habe ich diese Methode.

def get_chains_updated(date): 
    slugs = [] 
    # Chain class can't do aggregate could create a class instance if i want 
    cursor = db.chain.aggregate([ 
    {'$match':{'last_update':{'$gt':date}}}, 
    {'$group':{'_id':{'site':'$site'}, 'total':{'$sum':'$count'}}} 
    ]) 

    while (yield cursor.fetch_next): 
    res = yield cursor.next_object() 
    slugs.append(res['_id']['site']) 

    yield slugs 

Später nenne ich diese Methode eine meiner Ansichten

chain_slugs_updated = yield chaindb.get_chains_updated(yesterday) 
slugs = [] 
#for site in chain_slugs_updated: 
while (yield chain_slugs_updated.fetch_next): 
    site = chain_slugs_updated.next_object() 
    slugs.append('<a href="/admin/sites/settings?slug=%s">%s</a>' % (site, site)) 
notes.append('<strong>%s</strong> chains have been updated in the past 24 hours (%s).' % (chain_slugs_updated.count(), ', '.join(slugs))) 

Dies ist, was es sein verwenden, wenn ich wurde mit pymongo lib

def get_chains_updated(date): 
    slugs = [] 
    # Chain class can't do aggregate could create a class instance if i want 
    results = db.chain.aggregate([ 
    {'$match':{'last_update':{'$gt':date}}}, 
    {'$group':{'_id':{'site':'$site'}, 'total':{'$sum':'$count'}}} 
    ]) 
    for res in results: 
    slugs.append(res['_id']['site']) 
    return slugs 

Ansicht

chain_slugs_updated = chaindb.get_chains_updated(yesterday) 
    slugs = [] 
    for site in chain_slugs_updated: 
     slugs.append('<a href="/admin/sites/settings?slug=%s">%s</a>' % (site, site)) 
    notes.append('<strong>%s</strong> chains have been updated in the past 24 hours (%s).' % (len(chain_slugs_updated), ', '.join(slugs))) 

Ich habe Tonnen von Code ich Um zu übersetzen, dass Async richtig funktioniert, würde ich jede Hilfe sehr schätzen. Vielen Dank.

Antwort

1

Um eine Liste von Objekten aus get_chains_updated zurückkehren, müssen Sie entweder return slugs die Liste (Python 3) oder raise gen.Return(slugs) (alle Python-Versionen). Weitere Informationen finden Sie unter Refactoring Tornado Coroutines.

Verwandte Themen