2010-04-30 62 views
2

對於一個bookmarklet項目我試圖從我的服務器(這自然是在不同的域中)使用jQuery來運行Django動力系統來獲取JSON數據。如何從Django中輸出JSON並從跨域調用jQuery?

根據jQuery文檔:「從jQuery 1.2開始,如果您指定了JSONP回調,您可以加載位於另一個域的JSON數據,可以這樣做:」myurl?callback =?「。jQuery自動替換?調用正確的方法名稱,調用指定的回調函數。「

$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any& format=json&jsoncallback=?", 
     function(data){ 
      alert(data.title); 
     }); 

它打印在一個警告窗口返回的數據,例如:而且比如我可以成功地在我的Firebug的控制檯中使用下面的代碼片斷測試'最近上傳標籤的貓'。然而,當我嘗試用我的服務器類似的代碼,我完全不得到任何東西:

$.getJSON("http://mydjango.yafz.org/randomTest?jsoncallback=?", 
     function(data){ 
      alert(data.title); 
     }); 

有沒有警報窗口,Firebug的狀態欄說:「把從mydjango.yafz.org數據.. 「並繼續等待。在服務器端,我有這樣的:

def randomTest(request): 
    somelist = ['title', 'This is a constant result'] 
    encoded = json.dumps(somelist) 
    response = HttpResponse(encoded, mimetype = "application/json") 
    return response 

我也試過這個沒有任何成功:

def randomTest(request): 
    if request.is_ajax() == True: 
     req = {} 
     req ['title'] = 'This is a constant result.' 
     response = json.dumps(req) 
     return HttpResponse(response, mimetype = "application/json") 

因此削減長話短說:什麼是返回一個數據的建議的方法在Django視圖中,並使用交叉域時尚的jQuery檢索它?我上面的錯誤是什麼?

回答

15

這似乎是工作(我忘了處理回調參數!):

服務器端的Python/Django的代碼:

def randomTest(request): 
    callback = request.GET.get('callback', '') 
    req = {} 
    req ['title'] = 'This is a constant result.' 
    response = json.dumps(req) 
    response = callback + '(' + response + ');' 
    return HttpResponse(response, mimetype="application/json") 

客戶端的jQuery代碼來獲取這些數據:

$.getJSON("http://mydjango.yafz.org/polls/randomTest?callback=?", 
     function(data){ 
      alert(data.title); 
     }); 

有沒有更好的方法來實現相同的效果(在Python和Django編碼方面更成熟的方法)?

+0

,是新來的Django和jQuery,我嘗試了一個 「Hello World」 使用django1.3,從我的jQuery功能我怎麼能叫Python的功能(在views.py) – Jisson 2011-09-30 09:44:40

+0

jQuery是「投票/ randomTest '$ .getJSON(「http://mydjango.yafz.org/polls/randomTest?callback=?」在你的urls.py中取回一個url? – Jisson 2011-09-30 09:45:44

+0

我可以直接從jquery函數調用python函數嗎? – Jisson 2011-09-30 09:46:53

1

Django 1.7起,你可以簡單地使用JsonResponse

>>> from django.http import JsonResponse 
>>> response = JsonResponse({'foo': 'bar'}) 
>>> response.content 
b'{"foo": "bar"}' 
+0

JsonResponse很酷,但這個答案並沒有顯示如何創建一個JSONP響應(帶回調)。 – Czechnology 2016-11-22 20:54:10