【问题标题】:Substituting JS variable into a string that is a jinja template将 JS 变量替换为作为 jinja 模板的字符串
【发布时间】:2020-10-08 02:02:16
【问题描述】:

我的客户端事件处理程序如下:

socket.on('received_message',function(data){
           console.log(data);

           var actual="{% if "+int(data['user_id'])+"==current_user.id %}<div class=\"user\" id=\"postof"+data['post_id']+"\"\"><span><strong><u>"+data['username']+"</u></strong></span><a href=\"{{url_for('delete_post',post_id="+data['post_id']+",thread_id="+data['thread_id']+")}}\">Delete</a><p>"+data['msg']+"</p></div>{% else %}<div class=\"notuser\" id=\"postof"+data['post_id']+"\"><span><strong><u>"+data['username']+"</u></strong></span><p>"+data['msg']+"</p></div>{% endif %}";
           console.log("{{dif_user}}")
           console.log('{{current_user.id}}'+"  "+data['user_id']);
           console.log(actual);
           document.getElementById('posts').innerHTML+=actual;
           $('.container').scrollTop($('.container')[0].scrollHeight);
         });

我对上述事件处理程序的服务器端调用是

socketio.emit('received_message',{'room':data['room'],'user_id':p.user_id,'username':user_.username,'msg':p.message,'post_id':p.id,'thread_id':thread_.id},room=data['room'],dif_user=p.user_id)

现在代码不能正常工作,因为插入的 jinja 代码总是导致执行 else 部分。如何将 js 变量 data['user_id'] 合并到我创建的 actual 变量中,以便烧瓶正确呈现它。

我认为 flask 将替换的 data['user_id'] 作为字符串,因为 else 部分正在执行。

【问题讨论】:

    标签: javascript html socket.io jinja2 flask-socketio


    【解决方案1】:

    您必须考虑到 Jinja 模板是在通过 render_template 返回模板时执行的,因此使用 if 块或 else 块的决定将在那时根据当时的变量值做出。客户端接收到 Socket.IO 事件时,不会重新评估条件,因为客户端会在没有 Python 干预的情况下接收到该事件。

    如果您希望客户端在收到 Socket.IO 事件时评估条件,那么您必须在 JavaScript 中编写条件。

    【讨论】:

    • 如果 Jinja 模板在加载时在 render_template 的帮助下呈现,并且在 socketio 事件期间无法呈现,那么在我的代码中添加的代码总是 Jinja 的 else 部分,这是否意味着即使在 socketio 事件期间 Jinja 实际上也在被评估
    • 不,这意味着客户端中的页面只有 Jinja 条件的“else”部分,因为这是调用 render_template 时执行的部分。在浏览器中查看 HTML 页面源代码以确认。
    猜你喜欢
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 2015-04-18
    • 1970-01-01
    • 2015-05-24
    相关资源
    最近更新 更多