python - Flask如何仿制微博评论发表的效果
PHP中文网
PHP中文网 2017-04-18 09:41:56
0
3
765

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

PHP中文网
PHP中文网

认证0级讲师

Antworte allen(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,这个时候,在下面的评论页面(分页显示的话),就会直接显示到最后一页你的评论那里了
不知道我这样说的话你是否清楚。

Ty80

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

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage