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. djangoの最後でオブジェクトをjsonfyすることなくpythonオブジェクトをjavascriptに渡すのは安全ですか?そうでない場合、発生する可能性のある問題は何ですか?

それで、あなたは私の問題について何を言わなければなりませんか?

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 に答える