前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PKW: Flask-JSGlue 库简介(第 6 期)

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

作者头像
周萝卜
发布2019-08-20 14:51:23
1.3K0
发布2019-08-20 14:51:23
举报
文章被收录于专栏:萝卜大杂烩萝卜大杂烩

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

今天介绍一个有用的胶水库,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})) +

完美解决

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 萝卜大杂烩 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 问题场景
    • 使用 Flask-JSGlue 解决
    • 改写上面的 HTML 字符串
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档