是否可以从SQLite数据库中获取具有特定值的特定行,将其转换为JSON,然后使用Flask推送到网页?

时间:2018-11-01 16:53:27

标签: python sqlite flask flask-sqlalchemy

我正在尝试使用Flask-SQLAlchemy从SQLite文档中获取特定行,然后将其通过管道传递到JSON中,然后将其推送到页面。 我是Flask和Python的新手,但是我有足够的知识来做我需要做的事情,我只是不知道怎么做。

我当前的代码:

@app.route('/posts/<pid>', methods=["GET", "POST"])
def posts(pid):
    if request.method == "POST":
        post = Posts.query.filter_by(id=pid).first()
        comment = request.form.get('comment')
        # poid = request.form.get('postid')
        poid = pid
        print(poid)
        c = Comments(id=len(Comments.query.all())+1, comment=comment, user=current_user.username, postid=poid)
        db.session.add(c)
        db.session.commit()
        return render_template("post.html", title=post.title, body=post.body, user=post.user, id=poid)
    post = Posts.query.filter_by(id=pid).first()
    # c = Comments()
    # print(json.dumps(c, cls=AlchemyEncoder))

    comments = Comments.query.filter_by(id=pid).all()
    jsonToPush = {'comments': []}
    print(comments)
    for comment in comments:
        print(comment.postid)
        if comment.postid == pid:
            print("Found comment")
            jsonToPush['comments'].append({ "id": comment.id, "postid": comment.postid, "comment": comment.comment, "user": comment.user})
            print(jsonToPush)
            return render_template("post.html", title=post.title, body=post.body, user=post.user, id=pid, jtp=jsonToPush)
    return render_template("post.html", title=post.title, body=post.body, user=post.user, id=pid)

当我print(comments)时它会打印出[<Comments 1>]

当我print(comment.postid)时它会打印出1

无论有多少评论,它只会打印出1

我已经制定了如何在站点中使用JSON的计划,我只需要帮助将SQL导入站点即可。任何帮助表示赞赏。 谢谢!

2 个答案:

答案 0 :(得分:0)

通常,数据库表中的idprimary key,表示它是uniquenot null。唯一性是关键(没有双关语),因为当您执行此行comments = Comments.query.filter_by(id=pid).all()时,您只能通过主键约束获得一个注释。

请注意,其次,jijna2中有一个过滤器,因此您可以将python对象传递给jinja2,而无需使用JSON格式,并且可以直接在html中进行转换,例如:

render_template('some.html', arr=[1,2,3], dict={'pigs': 'nice', 'fish': 'unfriendly'})
===============
<div> {{ arr | tojson }} {{ dict | tojson }} </div>

顺便说一句,请注意,您可以在函数顶部放置以下行:post = Posts.query.filter_by(id=pid).first(),以避免在某些情况下两次被调用。其实那不是真的,它只会被调用一次,但是在我看来,它只被键入一次看起来更好! :)

编辑..

我假设Comments是一张桌子。假设您有一个看起来像这样的数据库模型(我只是在猜测):

def Comments(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    post_id = db.Column(db.Integer, db.ForeignKey('posts.id'), nullable=False)
    data = db.Column(db.String)

然后,您可以为Comment类创建字典生成器。您可以在很多地方执行此操作,但这是显式功能。

def comment_dict(comment):
    return dict(id=comment.id, post_id=comment.post_id, data=comment.data)

然后,您可以进行数据库查询以返回评论的迭代器,并使用列表推导来形成字典列表:

comments = Comments.query.all() # or some filtered subset
render_template(comments = [comment_dict(comment) for comment in comments])

在您的html中,您可以通过以下方式将注释作为JSON对象的JSON数组访问:

{{ comments | tojson }}

答案 1 :(得分:0)

我修复了。

我当前的代码是这样:

@app.route('/posts/<postid>', methods=["GET", "POST"])
@login_required
def posts(postid):
    post = Posts.query.filter_by(id=postid).first()
    if request.method == "POST":
        comment = request.form.get('comment')
        c = Comments(id=len(Comments.query.all())+1, comment=comment, user=current_user.username, postid=postid)
        db.session.add(c)
        db.session.commit()
        return redirect('/posts/{}'.format(postid))
    # c = Comments()
    # print(json.dumps(c, cls=AlchemyEncoder))

    comments = Comments.query.filter_by(postid=postid).all()
    print(Comments.query.all())
    return render_template("post.html", title=post.title, body=post.body, user=post.user, id=postid, comments = [comment_dict(comment) for comment in comments])

编辑:我根据以下Attack68的答案得出此答案。给他荣誉,不是我:)