我正在尝试使用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导入站点即可。任何帮助表示赞赏。 谢谢!
答案 0 :(得分:0)
通常,数据库表中的id
是primary key
,表示它是unique
和not 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的答案得出此答案。给他荣誉,不是我:)