【问题标题】:Flask + SQLAlchemy: Class not IterableFlask + SQLAlchemy:类不可迭代
【发布时间】:2015-02-06 15:41:41
【问题描述】:

我在尝试将 SQLAlchemy 查询呈现到模板时遇到问题,我得到的错误是:

TypeError: 'Users' object is not iterable

数据库是一个 sqlite
我一直在关注 youtube 上的“发现真正的 Python”教程,这对我有很大帮助。我唯一改变的是在教程中他使用“博客帖子”,而我使用“用户”

我试图了解他如何让用户在模板中的代码版本中进行迭代。

我的Models.py 文件是这样的:

from app import db

class Users(db.Model):
    __tablename__="users"

    id= db.Column(db.Integer, primary_key=True)
    username=db.Column(db.String, nullable=False)
    password=db.Column(db.String, nullable=False)

    def __init__(self, username, password):
        self.username=username
        self.password=password

    def __repr__(self):
        return '<username{}'.format(self.username)

还有我的“app.py”文件。

from flask import Flask, render_template, redirect, url_for, request, session, flash
from functools import wraps
#import sqlite3
from flask.ext.sqlalchemy import SQLAlchemy


app= Flask(__name__)

app.secret_key="this is the secret key"
#app.database="users.db"

app.config['SQLALCHEMY_DATABASE_URI']='sqlite:////users2.db'

db=SQLAlchemy(app)

from models import *

def login_required(f):
    @wraps(f)
    def wrap(*args, **kwargs):
        if 'logged_in' in session:
            return f(*args, **kwargs)
        else:
            flash('You must be logged in to complete this action')
            return redirect(url_for('login'))
    return wrap


@app.route('/')
def index():
    users= db.session.query(Users).all()
    return render_template('index.html', users=users)


@app.route('/testing')
def testing():
    users= db.session.query(Users).all()
    return render_template('testquery.html', users=users)


@app.route('/welcome')
def welcome():
    return render_template('index.html')


@app.route('/login', methods =['GET', 'POST'])
def login():
    error= None
    #form = LoginForm(request.form)
    if request.method == 'POST':
    #if request.form.validate_on_submit():
        if request.form['username'] !='admin' or request.form['password'] !='admin':
            error= 'invalid credentials'
        else:
            session ['logged_in']=True
            flash('login successful')
            return redirect(url_for('loggedin'))
    #else:
        #render_template('login.html', form=form, error=error)
    return render_template('login.html', error=error)


@app.route('/loggedin')
@login_required
def loggedin():
    return render_template('loggedin.html')


@app.route('/logout')
def logout():
    session.pop('logged_in', None)
    flash('You have been logged out')
    return redirect(url_for('welcome'))


#def connect_db():
#   return sqlite3.connect(app.database)

if __name__=='__main__':
    app.run(debug=True)

我一直使用的文本方法是“/testing”的路径,testquery.html 文件是我一直在尝试测试的,并且一直在出错。

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
    <body>


        <table>
        {%for user in users%}
            <tr>
                <td>{{user.username}}</td>
                <td>{{user.password}}</td>
            </tr>

        </table>
        {%endfor%}

    </body>
</html>

我尝试了我在另一个堆栈问题中看到的修复:

def __init__(self, username, password):
    self.username=[username]
    self.password=[password]

无济于事,这没有任何改变。 任何人都知道我需要做什么才能使其可迭代。

【问题讨论】:

  • 请包含错误的完整回溯。

标签: python sqlite flask sqlalchemy flask-sqlalchemy


【解决方案1】:

testing 中,您没有用户列表。您在这里有一个用户:

users = db.session.query(Users).first()

这只会返回数据库中的第一个用户。因此,您也不能遍历用户。将其重命名为 user(删除 s)并删除模板中的循环:

@app.route('/testing')
def testing():
    user = db.session.query(Users).first()
    return render_template('testquery.html', user=user)

<table>
  <tr>
    <td>{{user.username}}</td>
    <td>{{user.password}}</td>
  </tr>
</table>

【讨论】:

  • 编辑完成,在测试时我改变了很多东西。但我最初使用的是“all()”
  • @TheTimes:你在/ 路线上做。
  • 好的,所以我基本上只是按照您的建议进行操作,并让它工作。然后我开始把它改回原来的样子,它神奇地起作用了:/我讨厌这样的事情发生,我确定有些事情发生了变化,但这似乎是编程魔法。
猜你喜欢
  • 2021-12-25
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2019-04-15
  • 2021-07-30
  • 2014-01-07
相关资源
最近更新 更多