Flask如何仿制微博评论发表的效果

我想仿制微博评论的效果,就是发表评论之后,用户可以实时看见自己发的评论。
我尝试了使用重定向return redirect('main.index'),可是这样的话,并不能聚焦到原来那条微博的评论列表下面。
想请教下:
1.如果想发表评论后用户能实时看见自己发表的评论,那么在Flask的路由中return语句应该怎么写?
2.这种情况是否应该用ajax来解决??如果是的话,使用jQuery怎么与wtforms渲染的表单配合使用呢?

阅读 4.5k
3 个回答

微博这种叫做单页应用(SPA),前后端分离通过api传递数据。
只想仿评论效果,就是用你自己的答案,ajax提交后端api,保存后回调修改页面,wtform基本是摆设,没关系了。

最好把你的代码一起贴一下。

下面是我的建议

当你发表评论时,你肯定做的是提交表单,但是你需要在提交表单后面的重定向里面,让网站知道你刚才做的是评论
所以,在你提交完以后的重定向里面,你可以加一个page=-1进去
请看下面例子

@main.route('/post/<int:id>')
def post(id):
    post = Post.query.get_or_404(id)
    form = CommentForm()
    if form.validate_on_submit():
        comment = Comment(body = form.body.data, post = post, author = current_user._get_current_object())
        db.session.add(comment)
        flash('Your comment has been published.')
        return redirect(url_for('.post',id = post.id, page = -1))
    page = request.args.get('page',1,type=int)
    if page == -1:
        page = (post.comments.count()-1)//current_app.config['FLASKY_COMMENTS_PER_PAGE']+1
        pagination = post.comments.order_by(Comment.timestamp.asc()).paginate(
            page,per_page = current_app.config['FLASKY_COMMENTS_PER_PAGE'],
            error_out = False)
        comments = pagination.items
    return render_template('post.html',posts=[post],form = form,comments=comments,pagination = pagination)    

里面代码的page是用来作为分页显示用的,你可以理解为url里面指向第几页的参数
当他提交完表单以后,做的是重定向return redirect(url_for('.post',id = post.id, page = -1))
并且,url_for是可以带**kwargs的,这样,你的请求里面就带有一个page=-1
下面语句当 page == -1时,他通过计算(现有有评论总数)除以(每页显示的评论数),计算出最后一页的页数是几

并重新赋值给page,这个时候,在下面的评论页面(分页显示的话),就会直接显示到最后一页你的评论那里了
不知道我这样说的话你是否清楚。

使用Websocket吧,网站上了规模总有适用于websocket的情形,单页应用的话倒不是必须的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题