我正在使用Django创建一个网站,我希望通过Django模板和Dajax调用从我的视图(创建它)传递一个python对象。问题是,当它到达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字符串?
答案 0 :(得分:1)
首先尝试了解发生了什么:
在您的模板上,您尝试将Python对象保存为Javascript var:
var emailer = "{{emailer|safe}}";`
但这是不可能的。当您的模板由Django呈现时,您真正得到的是对对象__str __()方法的调用,您的Javascript将在您的emailer var上存储&lt; Utils.SIMPL_Emailer实例(0x103142ab8&gt; 值)。请记住:此代码在客户端浏览器中运行。这就是删除引号时出现错误的原因。
要解决此问题,您需要首先序列化您的电子邮件对象(例如,将其转换为可以表示为String的内容,然后转回Python对象)。但正如Peter DeGlopper指出的那样,这是一种非常不安全的方法。从来没有,反序列化一个公共可访问的整个对象。而是仅将电子邮件数据发送到您的模板。您可以使用此数据创建字典,将其转换为JSON(它也是序列化,但这次只是序列化数据),然后将其传递给模板。
所以不要把你的电子邮件放在模板上下文中。而是创建一个dictonary并将其传递给模板。
然后在您的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})