PKW: Flask-JSGlue 库简介(第 6 期)

2019-08-20 14:51:23 浏览数 (1)

微信公众号:萝卜大杂烩 关注可了解更多的原创内容。问题或建议,请公众号留言或加本人微信; 如果你觉得文章对你有帮助,欢迎加微信交流

今天介绍一个有用的胶水库,Flask-JSGlue,看它的名字,也基本可以看出是连接 Flask 和 JavaScript 的桥梁。 我们先来看看它主要解决的问题

问题

使用 Flask 做 web 开发,不可避免的会遇到在 js 中处理 URL,而我们都知道,在 Flask 中使用 url_for 是很好的动态创建 url 的方式。举个栗子

在 HTML 中使用

代码语言:javascript复制
<img src="{{ url_for('static', filename='chat/images/hi.jpg')}}">

在 后台逻辑中使用

代码语言:javascript复制
return redirect(url_for('main.index'))

以上,都不会有什么问题。

问题场景

在页面加载完成之后,某些动作,会触发页面新增一些 HTML 代码,说起来比较抽象,还是看个栗子

代码语言:javascript复制
function sendMessage(event, from_name, to_uid, to_uname){
    var msg = $("#message_not").val();
    var myDate = new Date();
    var myTime = myDate.toLocaleTimeString();
    var itTime = myDate.toLocaleString();
    var htmlData =   '<div class="msg_item fn-clear">'
                     '   <div class="uface"><img src="{{ url_for('static', filename='chat/images/hi.jpg')}}" width="40" height="40"  alt=""/></div>'
                     '   <div class="item_right">'
                     '     <div class="msg own">'   msg   '</div>'
                     '     <div class="name_time">'   from_name   ' · '   itTime  '</div>'
                     '   </div>'
                     '</div>';
    $("#message_box").append(htmlData);
    $('#message_box').scrollTop($("#message_box")[0].scrollHeight   20);
    $("#message_not").val('');
    setTimeout(function(){sendToServernoLogin(from_name, msg)}, 1000); //延时调用
}

这是我一个在线聊天室的 js 代码,在调用该函数后,会在 message_box 中增加一段 HTML 代码,用来展示用户发送的消息。

可以看到,在 htmlData 中,对于 img 标签,我用到了 url_for 函数来动态产生 URL,因为这个是用户的头像,很显然每个用户头像会有所不同,所以动态产生 URL 就是必须的了。

这样看起来还好,直接使用 url_for 编码到 HTML 代码中,也是可行的,下面我们再来看看另一种情况。

有一个类似如下形式的函数

代码语言:javascript复制
@app.route('/nvshen/<id>/', methods=['GET', 'POST'])
def nvshen(id):

那么使用 url_for 函数就需要为如下形式

代码语言:javascript复制
url_for("nvshen", id=123)

下面再来看看如果也是需要写到 HTML 代码里呢

代码语言:javascript复制
var myid = mydata[i][2];
var htmlText = '<article class="white-panel">'  
               '<img data-original='   myurl  ' class="thumb">'  
               '<h1>'  
               '<a href="{{ url_for('nvshen', id=myid)}}" title="去投票" target="_blank">'  
                myname   '</a>'  
                '</h1>'  
                '<p>'  
                '</p>'  
                '</article>';

类似上面的写法,我试过了各种方式,都不能正确传递 myid 的值,如果有哪位小伙伴知道解法的话,还请告知下。

使用 Flask-JSGlue 解决

我们先来看看 Flask-JSGlue 的官网,上面的例子也是非常的简单

后台逻辑

代码语言:javascript复制
from flask import Flask
from flask_jsglue import JSGlue

app = Flask(__name__)
jsglue = JSGlue(app)

前端页面

代码语言:javascript复制
<head>{{ JSGlue.include() }}</head>

Flask.url_for("index")

Flask.url_for("static", {"filename": "jquery.min.js"})

Flask.url_for("api.hello_world", {"param1": 1, "param2": "text"})

Flask.url_for("api.external_link", {"_external": true, "_scheme": "https", "_anchor": "main"})

对于需要传递 url 参数的情况,也能够很好的支持,beautiful!

改写上面的 HTML 字符串

代码语言:javascript复制
'<a href=URL title="去投票" target="_blank">'.replace("URL", Flask.url_for("nvshen", {id: myid}))  

完美解决

反正我是被惊艳到了,终于解决了我长久以来的困扰,香!

0 人点赞