如何显示 flask_sqlalchemy 中的列内容

How to show the column content in flask_sqlalchemy

我想了解为什么我看不到我在网站中添加的实际 ips, 当我使用

ips = Ip.query.all()

并用 Jinja 注入它我得到以下结果而不是我在表单中输入的实际 ips:

[<Ip 1>, <Ip 2>, <Ip 3>, <Ip 4>, <Ip 5>, <Ip 6>, <Ip 7>, <Ip 8>, <Ip 9>, <Ip 10>, <Ip 11>, <Ip 12>, <Ip 13>, <Ip 14>, <Ip 15>, <Ip 16>, <Ip 17>, <Ip 18>]

我在网上进行了搜索,但没有找到任何有用的信息。

这是我的代码:

app.py

from flask.app import Flask
from mainproject import app, db
from flask import render_template, url_for, abort, redirect, request, flash
from flask_login import login_user, login_required, logout_user
from mainproject.users.forms import LoginForm, SignUpForm, IpBlockForm
from mainproject.model import User, Ip
from werkzeug.security import generate_password_hash, check_password_hash


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

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

@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()
        if user is not None and user.check_password(form.password.data):
            login_user(user)
            flash(f'Thank you for login in {form.username.data}!', 'success')

            next = request.args.get('next')
            if next == None or not next[0]=='/':
                next = url_for('welcome_user')
        
            return redirect(next)
    return render_template('login.html', form=form)

@app.route('/logout', methods = ['GET', 'POST'])
def logout():
    logout_user()
    return redirect(url_for('login'))


@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()
        flash(f'Thank you for signing up {form.username.data}!', 'success')
        return redirect(url_for('login'))
    return render_template('signup.html', form=form)


@app.route('/iplist', methods = ['GET', 'POST'])
@login_required
def iplist():
    ips = Ip.query.all()
    return render_template('iplist.html', ips=ips)



@app.route('/IPBlock', methods = ['GET', 'POST'])
@login_required
def ipblock():
    form = IpBlockForm()
    if form.validate_on_submit():
        ip = Ip(ip_address=form.ipstoblock.data)
        db.session.add(ip)
        db.session.commit()

    return render_template('IPBlock.html', form=form)


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

html

{% extends 'base.html' %}
{%block content%}
    <h1>List of blocked IP's</h1>
    <form method = "POST">
    <div class="container-fluid form-group d-flex justify-content-center m-3">
      {{ips}}  


    </form>

 {%endblock%}   
</body>
</html>

型号

from mainproject import db, login_manager
from werkzeug.security import generate_password_hash,check_password_hash
from flask_login import UserMixin



@login_manager.user_loader
def load_user(user_id):
    return User.query.get(user_id)

class User(db.Model, UserMixin):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username  = db.Column(db.String(20), unique=True, index=True)
    password_hash = db.Column(db.String(128))

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

    def check_password(self,password):
        return check_password_hash(self.password_hash, password)


class Ip(db.Model):
    __tablename__ = 'ips'
    id = db.Column(db.Integer, primary_key=True)
    ip_address = db.Column(db.String(14), index=True)

Ip.query.all() 你得到数据库中所有行的列表。您可以使用 jinja for 循环并遍历 html.

中的 ips
{% for i in ips %}
{{i.ip_address }} 
{% endfor %}

这里 i 是单行数据库,如果你想打印它的 id 那么你将使用 i.id