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'
Python 3? Dicts haben diese Methode in Python 3 nicht. – Javier
Es scheint, dass 'flask_whooshalchemy' nicht Python 3-kompatibel ist. –
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? –