1

我有这个“模型”

class messages(models.Model):
    status_choices = (
        (u'read',u'read'),
        (u'unread',u'unread')
        )
    user = models.ForeignKey(User)
    message = models.TextField()
    status = models.CharField(max_length=6,choices=status_choices,default='unread')
    sender = models.ForeignKey(User,related_name="sender")

这是我的观点,它获取用户消息并将其传递给 javascript。

@login_required
def ajax_fetch_messages(request):
    if request.is_ajax():
        print(request.POST['user'])
        # first check that user himself asked for his/her messages
        requested_user = get_object_or_404(User,id=request.POST['user'])
        if requested_user == request.user:
            # do processing of messages
            user_messages = messages.objects.filter(user=requested_user,status='unread')
            '''try:
                response = dumps(messages)
            except:
                print("Unable to dump messages")'''
            return HttpResponse(user_messages)
        else:
            return HttpResponse("You're not authorised to do that")
    else:
        return HttpResponse("This method can't be called this way")

现在我有以下担忧

  1. 我无法对上述视图返回的对象进行 jsonify。所以我必须将视图返回的“消息”对象发送到 javascript。
  2. 将 python 对象传递给 javascript 而不在 django 端对对象进行 jsonfying 是否安全?如果不是,那么可能出现的问题是什么?

那么,你对我的问题有什么想说的吗?

4

1 回答 1

2

为什么你不能 jsonify 你的对象?如果您发送对象(我怀疑您是否可以,除非有一些中间件处理转换),它将腌制它并将其作为字符串发送,因此无论如何您始终可以对任何对象进行 jsonify。

例如,如果我想从名为“Company”的对象发送所有信息:

comp = Company.objects.all()[0]
info = {"name": comp.name, "url": comp.url, "created_on": datetime.strftime(comp.created_on, "%d-%m-%Y")}
return HttpResponse(json.dumps(info))

考虑到您发送的所有内容都应该是一个字符串(或将自动转换为字符串的整数)。

在您的 javascript 中发送 json 后,您只需要获取对象并解析它:

obj = JSON.parse(response)

就是这样!现在关于安全问题,我想到的唯一问题是您发送的信息可能不会像对象ID那样使用,此外没有真正的安全风险。

现在,如果您想要发送一个渲染视图,以便您可以使用模板的强大功能,您可以这样做:

from django.template import Context, loader

context = Context({'user': UserObject, 'company': CompanyObject})
html_t = loader.get_template(HTML_TEMPLATE_PATH)
html = html_t.render(context)

return HttpResponse(html)

现在在您的 ajax 中,您将收到渲染的模板,您可以立即使用它而无需任何 json。

于 2012-07-10T19:39:25.190 回答