Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Django模板将对象传递给javascript_Javascript_Python_Django_Unicode - Fatal编程技术网

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

通过Django模板将对象传递给javascript,javascript,python,django,unicode,Javascript,Python,Django,Unicode,我正在使用Django创建一个网站,我想通过Django模板将一个python对象从我的视图(创建它的地方)传递到一个Dajax调用。问题是,当它到达dajax时,它已经变成了unicode类型 在我的模板中 在这里,logger语句返回:type:,。有没有办法解决这个问题,让我获得emailer对象而不是unicode字符串?首先尝试了解发生了什么: 在模板上,您试图将Python对象保存到Javascript变量: var emailer = "{{emailer|safe}}";` 但

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

在我的模板中


在这里,logger语句返回:
type:,
。有没有办法解决这个问题,让我获得emailer对象而不是unicode字符串?

首先尝试了解发生了什么:

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

var emailer = "{{emailer|safe}}";`
但这是不可能的。当Django呈现模板时,您真正得到的是对object uu str uu()方法的调用,您的Javascript将把值存储在您的emailer变量中。请记住:此代码在客户端浏览器中运行。这就是为什么删除引号时会出现错误

要解决这个问题,您需要首先序列化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})
@dajaxice\u寄存器(方法='GET')
def sendEmail(电子邮件_json):
email=json.loads(email_json)#email_json是仅包含您的电子邮件数据的json
警告(“类型:%s,%s”%(类型(email\u json),email\u json))
emailer=emailer(“”)
emailer.addToMessage(email.get('body'))
emailer.send()
message=“已发送电子邮件”
返回json.dumps({'message':message})

Wait,是否要将实际序列化的Python对象传递到模板中并通过JavaScript返回?这似乎非常不安全。你不能在
sendmail
函数中传递创建emailer对象所需的最低信息吗?我想避免实例化新对象,因为当对象实例化时,与类相关的许多“后台”进程运行会减慢我的网站。我正在创建的网站不会被公众访问(它将在一个私人服务器上),所以我不太担心。如何序列化对象,然后将其从字符串或unicode转换回对象?可以使用pickle模块:。但也有一些对象是“不可点击的”,比如套接字。你的Emailer对象可能会遇到这个问题。我很确定没有办法使用序列化来避免实例化新实例的时间。序列化所做的只是提供一种封装对象所有信息的方法。想想看——如果您保存了HTML,重新启动了计算机,然后再次解析了序列化字符串,那么显然您正在创建一个新实例。类似地,也不能保证相同的线程会像处理基本视图一样处理Ajax请求。您需要重新考虑您的方法——如果在Ajax请求之前实际上不需要电子邮件发送程序,那么可能不在视图中实例化它。
var emailer = "{{emailer|safe}}";`
@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})