将信息从javascript传递到django应用程序并返回

时间:2012-08-01 15:32:21

标签: javascript python ajax django

所以我试图基本上设置一个用户选择id的网页,然后网页将id信息发送到python,其中python使用id查询数据库,然后将结果返回给用于显示的网页。

我不太确定如何做到这一点。我知道如何使用ajax调用来调用python生成的数据,但我不确定如何将初始id信息传递给django应用程序。是否可以说,查询一个像./app/id(IE / app / 8)的网址,然后使用网址信息给python信息?我该如何编辑urls.py和views.py呢?

谢谢,

3 个答案:

答案 0 :(得分:28)

你在谈论AJAX。 AJAX总是需要3个(技术上,只有两个:Javascript做双重任务)。

  1. 客户端(本例中为Javascript)发出请求
  2. 服务器(本例中为Django视图)处理请求并返回响应
  3. 客户端(再次,Javascript)收到回复并使用它做某事
  4. 你还没有指定一个首选框架,但如果没有某种Javascript框架,你就会疯狂地做AJAX,所以我要为你选择jQuery。代码可以很容易地适应任何Javascript框架:

    $.getJSON('/url/to/ajax/view/', {foo: 'bar'}, function(data, jqXHR){
        // do something with response
    });
    

    我正在使用$.getJSON,这是一个jQuery便捷方法,它将一个GET请求发送到一个URL,并自动将响应解析为JSON,将其转换为一个在data传递的Javascript对象。第一个参数是请求将被发送到的URL(稍后更多),第二个参数是一个Javascript对象,其中包含应与请求一起发送的数据(如果您不需要,可以省略它)发送任何数据),第三个参数是回调函数,用于在成功时处理来自服务器的响应。所以这段简单的代码涵盖了上面列出的第1部分和第3部分。

    下一部分是你的处理程序,当然在这种情况下是Django视图。视图的唯一要求是它必须返回JSON响应:

    from django.utils import simplejson
    
    def my_ajax_view(request):
        # do something
        return HttpResponse(simplejson.dumps(some_data), mimetype='application/json')
    

    请注意,此视图不会采用除必需request之外的任何参数。这是一个哲学上的选择。恕我直言,以真正的REST方式,数据应该与请求一起传递,而不是在URL中传递,但其他人可以并且确实不同意。最终的选择取决于你。

    另外,请注意,我在这里使用了Django的simplejson库,它对于常见的Python数据结构(列表,dicts等)是最佳的。如果要返回Django模型实例或查询集,则应使用序列化程序库。

    from django.core import serializers
    ...
    data = serializers.serialize('json', some_instance_or_queryset)
    return HttpResponse(data, mimetype='application/json')
    

    现在你有了一个视图,你需要做的就是将它连接到Django的urlpatterns中,这样Django就会知道如何路由请求。

    urlpatterns += patterns('',
        (r'^/url/to/ajax/view/$', 'myapp.views.my_ajax_view'),
    )
    

    这就是哲学差异的来源。如果您选择通过URL本身传递数据,则需要在urlpattern中捕获它:

    (r'^/url/to/ajax/view/(?P<some_data>[\w-]+)/$, 'myapp.views.my_ajax_view'),
    

    然后,修改您的视图以接受它作为参数:

    def my_ajax_view(request, some_data):
    

    最后,修改Javascript AJAX方法,将其包含在URL中:

    $.getJSON('/url/to/ajax/view/'+some_data+'/', function(data, jqXHR){
    

    如果您按照请求传递数据的路线,那么您需要注意在视图中正确地进行检索:

    def my_ajax_view(request):
        some_data = request.GET.get('some_data')
        if some_data is None:
            return HttpResponseBadRequest()
    

    这应该足以让你接受Django的任何AJAX功能。其他任何事情都与视图如何检索数据(手动创建,查询数据库等)以及Javascript回调方法如何处理JSON响应有关。关于这一点的一些提示:

    1. data对象通常是一个列表,即使只包含一个项目。如果您知道只有一个项目,则可以使用data[0]。否则,使用for循环访问每个项目:

      form (var i=0; i<data.length; i++) {
          // do something with data[i]
      }
      
    2. 如果datadata[i]是对象(AKA字典,散列,键控数组等),则可以通过将键视为属性来访问键的值,即:

      data[i].some_key
      
    3. 在处理JSON响应和AJAX时,通常最好先在浏览器中直接尝试,这样您就可以查看确切的响应和/或验证响应的结构。要在浏览器中查看JSON响应,您很可能需要一个exstention。 JSONView(适用于FirefoxChrome)将使其能够理解JSON并将其显示为网页。如果请求是GET,您可以使用查询字符串(即http://mydomain.com/url/to/ajax/view/?some_data=foo)以正常的GET方式将数据传递到URL。如果是POST,则需要某种REST测试客户端。 RESTClient是Firefox的一个很好的插件。对于Chrome,您可以尝试Postman。这些也非常适合从Twitter,Facebook等学习第三方API。

答案 1 :(得分:1)

是的,有可能。如果您将id作为参数传递给视图,您将在应用程序中使用,例如: def example_view (request,id) 在urls.py中,你可以使用这样的东西: url(r'^example_view/(?P<id>\d+)/', 'App.views.example_view')

url /example_view_template/8中的id将使用与数字8相关的id访问结果。例如,数据库中特定表的第8条记录。

答案 2 :(得分:0)

关于如何从ajax请求/网址中捕获信息,通常你可以像在普通的django请求中那样做,检查url dispatcher docs并阅读官方文档中的django视图。

关于如何返回回复,只需捕获参数,处理您的请求,然后使用适当的mimitype给您的回复。

有时您必须serialize或将您的数据转换为另一种格式,如json,可以在客户端/ js中更有效地处理