2012-07-23 100 views
4

我試圖訪問另一個服務的API,使用我的模型的字段作爲API請求中的關鍵字。該網址會像像這樣:Django API請求

http://api.example.com/json/?first_name=FNAME&last_name=LNAME&key={key} 

下面是views.py我的代碼:

class ExamplePersonView(ListView): 

    context_object_name = "example_person" 
    template_name = "templates/example_person.html" 

    def get_queryset(self): 
     lname = get_object_or_404(ExamplePeople, lname__iexact=self.args[0]) 
     return ExamplePeople.objects.filter(lname=lname) 

據我瞭解,我需要用我的AJAX頁面模板之間溝通我views.py發送請求,然後在頁面上顯示信息。

我發現了幾個Django應用程序,可以很容易地將您的模型轉換爲公共API,但沒有一個可以幫助您從另一個服務訪問API。有人知道這樣的應用程序嗎?

如果沒有,是否有人對Django使用AJAX做出請求並將其呈現在模板中有很好的理解?

回答

6

有幾種方式與「外國」API進行通信。沒有必要使用ajax。 Ajax僅用於在模板中進行背景調用,觸發您想到的任何事件。

但是,假設你想用Facebook的GraphAPI通信以檢索配置文件

http://graph.facebook.com/bill.clinton

標準的結果序列化爲JSON,它實現輕鬆放入AJAX或任何JavaScript庫,因此而得名的JavaScript對象表示法。

因此,與AJAX的例子可能是:

function callFacebook() { 
    $.ajax({ 
     type: "GET", 
     data: ({}), 
     dataType: 'json', 
     url: "http://graph.facebook.com/bill.clinton", 
     success: function(data){ 
      alert("Hi I am former "+data.name); 
     } 
    }); 
} 
callFacebook(); 

在你的JavaScript文件或腳本標籤之間的模板中包含這個你應該得到一個不錯的警告信息:

你好我前總統比爾克林頓

現在你可以把這個警報變成更有意義的東西,並把它放在h1標籤(不知道爲什麼th是有意義的)

$("body").html("<h1>"+data.name+"</h1>"); 

但有時你會想要檢索數據,並在你的應用程序中做一些與它的服務器端。

因此,創建一個Django URLPATTERN和觀點,例如:

from urllib2 import urlopen 
from django.http import HttpResponse 
from django.utils import simplejson  

def call_bill(request): 
    url = "http://graph.facebook.com/bill.clinton" 
    json = urlopen(url).read() 
    # do whatever you want 
    return HttpResponse(simplejson.dumps(json), mimetype="application/json") 

# add this to your url patterns 
url("^call_bill_clinton/$", call_bill) 

現在訪問您的網址

其邏輯結果,它也完全有可能通過某個用戶操作觸發異步事件。例如前面提到的ajax示例中的URL參數,也可以是像「/ call_bill_clinton /」這樣的django url。

<!-- add a button to call the function --> 
<button onclick="callFacebook();">Call Bill</button> 

function callFacebook() { 
    $.ajax({ 
     type: "GET", 
     data: ({}), 
     dataType: 'json', 
     url: "/call_bill_clinton/", 
     success: function(data){ 
      alert("Hi I am former "+data.name+" and I came from Django"); 
     } 
    }); 
) 
// remove the auto call 

而且Ajax調用,讓你做同樣的掛羊頭賣狗肉的HTTP請求,您可以使用各種請求方法涼爽的JavaScript事件相結合,像beforeSend事件

beforeSend: function() { 
     $('#loading').show(); 
    }, 

凡#loading可能是這樣的:

<div id="loading" style="display:none;"> 
     <img src="{% static "images/loading.gif" %}" /> 
    </div> 
+0

很好的解釋。儘管如果OP想要在已經加載的頁面內調用此視圖,但要異步拉取列表,則需要內部ajax請求。但是,如果OP只是直接加載這個完整的頁面,那麼你是對的,它只是一個沒有Ajax的視圖。 – jdi 2012-07-23 18:30:28

+0

我猜這不會在本地機器上工作?我將把代碼推送到我的服務器並在那裏測試,但目前爲止沒有結果。 – kmm 2012-07-24 15:45:14

+0

這應該在開發中工作得很好 – 2012-07-24 18:41:45