2016-06-14 3 views
4

Ich habe versucht, dies für eine Weile zu laufen, aber scheinbar ohne Erfolg. Ich habe eine Webanwendung, die die Benutzereingabedaten anfordert, die dann an die Datenbank übergeben werden. Wenn ich über den Browser addiere, werden die Daten an die db übergeben, aber Werkzeug spuckt eine Reihe von Fehlern zurück, die ich im Trace unten beschrieben habe.AttributeError, 'dict' Objekt hat kein Attribut 'iteritems'; Flask-SQLAlchemy Fehler bei der Übergabe an die Datenbank

Mein views.py:

from flask import request, flash, render_template, url_for, redirect 
from aalert import app, db 
import flask_whooshalchemy 
from flask_login import LoginManager, login_required, logout_user 
from aalert.forms import * 

from aalert.models import User, PubInfo, PrivInfo 

login_manager = LoginManager() 
login_manager.init_app(app) 
login_manager.login_view = 'login' 

@login_manager.user_loader 
def load_user(userid): 
    return User.query.filter(User.id==userid).first() 

@app.route('/signup', methods=['GET', 'POST']) 
def signup(): 
    form = SignupForm() 
    if form.validate_on_submit(): 
     user = User(username=form.username.data, password = form.password.data) 
     db.session.add(user) 
     db.session.commit() 
     return redirect(url_for('index')) 
    return render_template('signup.html', form=form) 

#pubinfo index 
@app.route('/') 
def index(): 
    entries = PubInfo.query.all() 
    return render_template('disp_tables.html', 
          entries=entries) 


@app.route('/login', methods=['GET', 'POST']) 
def login(): 
    form = LoginForm() 
    if form.validate_on_submit(): 
     user = User.query.filter_by(username=form.username.data).first_or_404() 
     if user.is_correct_password(form.password.data): 
      login_user(user) 
      return redirect(url_for('add')) 
     else: 
      flash('Incorrect username and password!') 
    return render_template('login.html', form=form) 


@app.route('/show_all') 
@login_required 
def show_all_data(): 
    entries = PubInfo.query.join(PrivInfo, PubInfo.id==PrivInfo.id) 
    return render_template('disp_all.html', 
          entries) 


@app.route('/add', methods=['POST', 'GET']) 
#@login_required #login required to add functions, points to @login_manager.user_loader 
def insert(): 
    form = AddEntry() 
    if request.method == 'POST': 
     if not request.form['firstname'] or not request.form['lastname'] or not request.form['age'] or not request.form['height'] or not request.form['last_loc'] or not request.form['missing_since'] or not request.form['contact_info'] or not request.form['home_address']: 
      flash('Please ensure all fields are filled out!') 
     else: 
      pubentry = PubInfo(request.form['firstname'], 
           request.form['lastname'], 
           request.form['age'], 
           request.form['height'], 
           request.form['last_loc'], 
           request.form['missing_since']) 

      priventry = PrivInfo(request.form['contact_info'], 
           request.form['home_address']) 
      db.session.add(pubentry) 
      db.session.add(priventry) 
      db.session.commit() 
      flash('Record successfully added.') 
      return redirect(url_for('index')) 
    return render_template('add.html', form=form) 


@app.route('/search', methods=['POST', 'GET']) 
def search(): 
    form = SearchForm() 
    if request.method == 'POST': 
     result = pubinfo.query.whoosh_search(request.form['search_query']) 
     return render_template('results.html', result=result) 
    return render_template('search.html', form=form) 




@app.route('/logout') 
def logout(): 
    logout_user() 

    return redirect(url_for('index')) 


@app.route('/test') 
def test(): 
    return redirect(url_for('login')) 

Die Spur von dem Fehler:

Traceback (most recent call last): 
    File "/home/scire/programs/python/aalert/env/lib/python3.5/site-packages/flask/app.py", line 2000, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "/home/scire/programs/python/aalert/env/lib/python3.5/site-packages/flask/app.py", line 1991, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
    File "/home/scire/programs/python/aalert/env/lib/python3.5/site-packages/flask/app.py", line 1567, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "/home/scire/programs/python/aalert/env/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise 
    raise value 
    File "/home/scire/programs/python/aalert/env/lib/python3.5/site-packages/flask/app.py", line 1988, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/home/scire/programs/python/aalert/env/lib/python3.5/site-packages/flask/app.py", line 1641, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "/home/scire/programs/python/aalert/env/lib/python3.5/site-packages/flask/app.py", line 1544, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
    File "/home/scire/programs/python/aalert/env/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise 
    raise value 
    File "/home/scire/programs/python/aalert/env/lib/python3.5/site-packages/flask/app.py", line 1639, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "/home/scire/programs/python/aalert/env/lib/python3.5/site-packages/flask/app.py", line 1625, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
    File "/home/scire/programs/python/aalert/aalert/views.py", line 75, in insert 
    db.session.commit() 
    File "/home/scire/programs/python/aalert/env/lib/python3.5/site-packages/sqlalchemy/orm/scoping.py", line 157, in do 
    return getattr(self.registry(), name)(*args, **kwargs) 
    File "/home/scire/programs/python/aalert/env/lib/python3.5/site-packages/sqlalchemy/orm/session.py", line 801, in commit 
    self.transaction.commit() 
    File "/home/scire/programs/python/aalert/env/lib/python3.5/site-packages/sqlalchemy/orm/session.py", line 399, in commit 
    self.session.dispatch.after_commit(self.session) 
    File "/home/scire/programs/python/aalert/env/lib/python3.5/site-packages/sqlalchemy/event/attr.py", line 256, in __call__ 
    fn(*args, **kw) 
    File "/home/scire/programs/python/aalert/env/lib/python3.5/site-packages/flask_sqlalchemy/__init__.py", line 231, in after_commit 
    models_committed.send(session.app, changes=list(d.values())) 
    File "/home/scire/programs/python/aalert/env/lib/python3.5/site-packages/blinker/base.py", line 267, in send 
    for receiver in self.receivers_for(sender)] 
    File "/home/scire/programs/python/aalert/env/lib/python3.5/site-packages/blinker/base.py", line 267, in <listcomp> 
    for receiver in self.receivers_for(sender)] 
    File "/home/scire/programs/python/aalert/env/lib/python3.5/site-packages/flask_whooshalchemy.py", line 239, in _after_flush 
    for model, values in bytype.iteritems(): 
AttributeError: 'dict' object has no attribute 'iteritems' 
+0

Python 3? Dicts haben diese Methode in Python 3 nicht. – Javier

+4

Es scheint, dass 'flask_whooshalchemy' nicht Python 3-kompatibel ist. –

+0

Ja, sieht aus wie 'flask_whooshalchemy' ist derzeit nicht Python 3 kompatibel. https://github.com/gyllstromk/Flask-WhooshAlchemy/pull/28 für einen Python 3-kompatiblen Zweig (hoffentlich). Sie könnten immer versuchen, diesen Zweig stattdessen zu verwenden? –

Antwort

3

In Python3 dict.items() macht das Gleiche, dass dict.iteritems() in Python2 tat. Ersetzen Sie einfach iteritems() durch items()!

+6

OP nicht geschrieben dieser Code. Es kommt aus dem Inneren des Flaschenstapels. – Kevin

-1

vor kurzem stieß ich auf denselben Fehler beim Versuch, flask-sqlalchemy in Python3 zu verwenden und war fast fest. i dann denken Sie daran, dass https://blog.miguelgrinberg.com/post/about-me bevor etwas getan hatte, und beschlossen, es

$ ausprobieren pip uninstall flaschen whooshalchemy pip installieren $ git + git: //github.com/miguelgrinberg/flask-whooshalchemy.git

Dieser arbeitete für mich

https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-x-full-text-search

Genießen. ..

Verwandte Themen