我正在使用Django创建一个网站,我希望通过Django模板将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函数
^{pr2}$这里logger语句返回:type: <type 'unicode'>, <Utils.SIMPL_Emailer instance at 0x103142ab8>
。有没有办法解决这个问题,这样我就可以得到emailer对象而不是unicode字符串?在
首先试着了解发生了什么:
在模板中,您试图将Python对象保存到Javascript变量:
但这是不可能的。当您的模板由Django呈现时,您真正得到的是一个对object\uu str_uu()方法的调用,您的Javascript将存储<;Utils.SIMPL_电子邮件实例为0x103142ab8>;值,并记住:此代码在客户端浏览器中运行。这就是为什么删除引号时会出现错误。在
要解决这个问题,首先需要序列化emailer对象(例如,将其转换为可以表示为字符串的对象,然后再返回Python对象)。但正如彼得·德格洛珀指出的那样,这是一种非常不安全的做法。永远不要反序列化可供公共访问的整个对象。而是只将电子邮件数据发送到模板。您可以用这些数据创建一个字典,将其转换为JSON(这也是一个序列化,但这次只序列化数据),然后将其传递给模板。在
所以不要把你的电子邮件放在模板上下文中。相反,创建一个听写并传递给模板。在
然后,在Python sendmail(emailer)方法中,需要实例化一个新的emailer对象并向其提供数据,例如:
^{pr2}$相关问题 更多 >
编程相关推荐