javascript - 通过 Django 模板将对象传递给 javascript

标签 javascript python django unicode

我正在使用 Django 制作一个网站,我想通过 Django 模板从我的 View (创建它的地方)传递一个 python 对象并传递给 Dajax 调用。问题是,当它到达 dajax 时,它已经变成了 unicode 类型。

在我的模板中

<script>
var emailer = "{{emailer|safe}}"; <---If I omit the quotes here then I get a javascript error.
sessionStorage.setItem('emailer',emailer);
$(document).ready(function(){

  $('.send').on('click', function(e){  
    var emailer = sessionStorage.getItem('emailer');

    Dajaxice.InterfaceApp.sendEmail(submitverify,{'emailer':emailer});
  });
});

</script>

dajax 函数

@dajaxice_register(method='GET')
def sendEmail(emailer):
    logger.warning("type: %s, %s" % (type(emailer),emailer))
    email_body = "message"
    emailer.addToMessage(email_body)
    emailer.send()

    message = "Email Sent"
return json.dumps({'message':message})

此处记录器语句返回:type: <type 'unicode'>, <Utils.SIMPL_Emailer instance at 0x103142ab8> .有什么方法可以解决此问题,以便我获得电子邮件对象而不是 unicode 字符串?

最佳答案

首先尝试了解正在发生的事情:

在您的模板上,您试图将 Python 对象保存到 Javascript var:

var emailer = "{{emailer|safe}}";`

但这是不可能的。当您的模板由 Django 呈现时,您真正得到的是对对象 __str__() 方法的调用,并且您的 Javascript 会将 您的电子邮件变量上的值。请记住:此代码在客户端浏览器中运行。这就是为什么在删除引号时会出现错误。

要解决它,您需要首先序列化您的 emailer 对象(例如,将其转换为可以表示为字符串的对象,然后再转换回 Python 对象)。但正如 Peter DeGlopper 所指出的,这是一种非常不安全的方法。永远不要反序列化可公开访问的整个对象。而是仅将电子邮件数据发送到您的模板。您可以使用这些数据创建一个字典,将其转换为 JSON(这也是一种序列化,但这次您只序列化数据),然后将其传递给您的模板。

所以不要将您的电子邮件放在模板上下文中。而是创建一个字典并将其传递给模板。

然后在您的 Python sendEmail(emailer) 方法中,您需要实例化一个新的 Emailer 对象并将数据提供给它,例如:

@dajaxice_register(method='GET')
def sendEmail(email_json):
    email = json.loads(email_json) # email_json is a json with your email data only
    logger.warning("type: %s, %s" % (type(email_json),email_json))
    emailer = Emailer("<with all your params...>")
    emailer.addToMessage(email.get('body'))
    emailer.send()

    message = "Email Sent"
    return json.dumps({'message':message})

关于javascript - 通过 Django 模板将对象传递给 javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32640029/

相关文章:

python - 如何在 Django 开发服务器运行时使用 unix 命令? (提供图片)

django - 服务器响应终端行分析。响应行的最后一部分是什么?

python - 如何使用纯 python 代码而不是 bash 递归地列出所有 block 文件、字符设备文件、管道文件、套接字文件?

python - 有没有一种方法可以在不使用中间件的情况下使用 scrapy 代理?

javascript - 在新页面中打开图像并在单击时打印

javascript - 使用 javascript 清除文本字段中的 Laravel session 值

Python。 Selenium 。拖放错误 'AttributeError: move_to requires a WebElement'

django - 捕获 protected 错误并向用户显示其消息而不是裸露的 500 代码

javascript - 返回包含过滤嵌套数组的新对象

javascript - Paper JS 的编程点击事件