2016-10-04 1 views
0

Ich bin ratlos gewesen und kann anscheinend nicht herausfinden, warum ich einen AssertionError erhalte. Ich arbeite gerade an einer Restapi mit der flask_restful lib. Ich Abfrage von:Empfangen von AssertionError mit Flask sqlalchemy und restful

@staticmethod 
def find_by_id(id, user_id): 
    f = File.query.filter_by(id=id).first() #Error is happening here 
    if f is not None: 
     if f.check_permission(user_id)>=4: 
      return f 
     print f.check_permission(user_id) 
     FileErrors.InsufficientFilePermission() 
    FileErrors.FileDoesNotExist() 

Die Fehlermeldung sieht wie folgt aus:

Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 2000, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1991, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
    File "/usr/local/lib/python2.7/dist-packages/flask_restful/__init__.py", line 271, in error_router 
    return original_handler(e) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1567, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "/usr/local/lib/python2.7/dist-packages/flask_restful/__init__.py", line 268, in error_router 
    return self.handle_error(e) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1988, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1641, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "/usr/local/lib/python2.7/dist-packages/flask_restful/__init__.py", line 271, in error_router 
    return original_handler(e) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1531, in handle_user_exception 
    assert exc_value is e 
AssertionError 

Dies ist, wie meine Datei-Modell wie folgt aussieht:

class File(db.Model): 
id = db.Column(db.Integer, primary_key=True) 
user_id = db.Column(db.Integer) 
parts = db.Column(db.Integer) 
size = db.Column(db.Integer) 
name = db.Column(db.String(100)) 

def __init__ (self, file_info): 
    self.user_id = file_info['user_id'] 
    self.parts = file_info['parts'] 
    self.size = file_info['size'] 
    self.name = file_info['name'] 

@staticmethod 
def create(file_info): 
    return add_to_db(File(file_info)) 

@staticmethod 
def delete(file_id, user_id): 
    pass 

def check_permission(self,user_id): 
    permission = 0 
    print 'self.user_id {}'.format(self.user_id) 
    print 'user_id {}'.format(user_id) 
    if self.user_id == user_id: 
     return 7 
    fs = FileShare.find_by_file_and_user_id(self.id, user_id) 
    if fs is not None: 
     permission = fs.permission 
    return permission 

@staticmethod 
def find_by_id(id, user_id): 
    f = File.query.filter_by(id=id).first() #Error is happening here 
    if f is not None: 
     if f.check_permission(user_id)>=4: 
      return f 
     print f.check_permission(user_id) 
     FileErrors.InsufficientFilePermission() 
    FileErrors.FileDoesNotExist() 

Jede mögliche Hilfe würde geschätzt. Danke im Voraus.

+0

@vishes_shell Entschuldigung, es gibt nicht zwei. Sie sind die gleichen. Ich wollte nur die ganze Klasse für Klarheit und Kontext posten. – h3y4w

+0

Es tut mir leid, dass ich nicht erwähnt habe, dass es eine Bildlaufleiste gibt, weil der Code lang ist. –

Antwort

0

Obwohl ich nicht heraus konnte, warum der Fehler auftritt, ich weiß, wie und wie sie zu verhindern. Es wird erstellt, weil die Abfrage die Live-Daten nicht direkt nach dem Festschreiben abruft. Um dies zu verhindern, verwenden Sie db.session.query(). Also in meinem Beispiel würde ich ändern:

f = File.query.filter_by(id=id).first()

zu

f = db.session.query(File).filter_by(id=id).first()

Aus irgendeinem Grund, das funktioniert. Obwohl ich nicht weiß warum.

EDIT: Es scheint mit der Klasse Empfang aktualisiert Sitzung nicht zu tun zu haben. Zur Zeit empfehle ich die Verwendung von Abfragen innerhalb der Sitzung.

0

Sind Sie sicher, dass Sie einen Zuweisungsoperator anstelle eines Vergleichs in Ihrem Filter haben möchten? Versuchen Sie, = mit == zu ersetzen und sehen Sie, ob es Ihr Problem löst.

f = File.query.filter_by(id == id).first() 

Hannu

+0

Leider funktioniert es nicht. Bei einigen meiner anderen Abfragen mache ich es so, wie es oben ist und es scheint kein Problem zu geben. Der zurückgegebene Fehler ist "TypeError: filter_by() nimmt genau 1 Argument (2 gegeben)". – h3y4w