【问题标题】:Django API RequestsDjango API 请求
【发布时间】:2012-07-21 21:18:23
【问题描述】:

我正在尝试访问另一个服务的 API,使用我模型的字段作为 API 请求中的关键字。 URL 应该是这样的:

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。有人知道这样的应用吗?

如果没有,是否有人对使用 AJAX 和 Django 发出请求并在模板中呈现它有很好的了解?

【问题讨论】:

    标签: ajax django api


    【解决方案1】:

    有几种方法可以与“外部”API 进行通信。没有必要使用ajax。 Ajax 仅用于在模板中进行后台调用,触发您想到的任何事件。

    但假设您想与 facebook GraphAPI 通信以检索个人资料

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

    标准结果被序列化为 JSON,可以轻松实现 AJAX 或任何 JavaScript 库,因此得名 JavaScript Object Notation。

    因此,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 标记中(不知道为什么这是有意义的)

    $("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 参数也可以是 django url,如“/call_bill_clinton/”。

    <!-- 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>
    

    【讨论】:

    • 很好的解释。尽管如果 OP 想要从已加载的页面中调用此视图,以异步拉取列表,那么这将需要一个内部 ajax 请求。但是,如果 OP 只是直接加载整个页面,那么你是对的,它只是一个没有 ajax 的视图。
    • 我猜这在本地机器上不起作用?我打算将代码推送到我的服务器并在那里进行测试,但到目前为止还没有结果。
    • 自动调用之前的右括号应该是一个右大括号 - 这就是让我绊倒的原因。无论如何,感谢您的出色回答!
    猜你喜欢
    • 2014-12-22
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 2020-12-26
    相关资源
    最近更新 更多