当前位置: 首页 > 面试题库 >

将信息从JavaScript传递到Django应用并返回

穆正祥
2023-03-14
问题内容

因此,我试图从根本上建立一个用户选择ID的网页,然后该网页将ID信息发送给python,在python中,python使用ID来查询数据库,然后将结果返回至该网页进行显示。

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

谢谢,


问题答案:

您正在谈论AJAX。AJAX总是需要3个部分(从技术上讲,只有2个部分:JavaScript具有双重职责)。

  1. 客户端(在这种情况下为Javascript)发出请求
  2. 服务器(在这种情况下为Django视图)处理请求并返回响应
  3. 客户端(再次是Javascript)收到响应并对其进行处理

您尚未指定首选的框架,但是如果没有某种Javascript框架,您会发疯,所以我将为您选择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')

请注意,此视图除了required之外不接受任何其他参数request。这是一个哲学选择。恕我直言,以真正的REST方式,数据应该随请求一起传递,而不是随URL传递,但是其他人可以并且确实不同意。最终选择取决于您。

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

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. 如果data或是data[i]对象(AKA字典,哈希,键控数组等),则可以通过将键视为属性来访问键的值,即:

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



 类似资料:
  • 问题内容: 因此,我试图从根本上建立一个用户选择ID的网页,然后该网页将ID信息发送给python,在python中,python使用该ID来查询数据库,然后将结果返回给该网页进行显示。 我不太确定该怎么做。我知道如何使用ajax调用来调用python生成的数据,但是我不确定如何将初始id信息传达给django应用。是否可以说,查询../app/id(IE / app / 8)之类的网址,然后使用

  • 我正在尝试在html WebView中将信息(lattiude,longitority)传递到google map。问题是应用程序没有在NetBeans中启动。它返回说: 使用平台执行C:\Users\Carlos\Documents\NetBeansProjects\OpenPilot\Dist\Run1883323097\OpenPilot.jar\JK1.8.0_05\JRE/bin/Jav

  • 问题内容: 我正在尝试使用javascript将查询集从Django传递到模板。 我尝试了不同的方法来解决此问题: 1.普通方法-由于命名法[&gt Object:ID&lt,&gt Object:ID&lt,…],Javascript试图解析对象一团糟 Django视图 模板HTML + JS 2. JSON方法-Django无法将对象列表转换为不可序列化的JSON字符串 Django视图 模板

  • 我正在使用Jython从Java运行python脚本。当我使用调用python脚本时,我可以将数据作为命令行参数发送到python脚本。

  • 问题内容: 我正在尝试使用Django和D3.js编写非常基本的条形图。我有一个名为play的对象,其中datetime字段称为date。我想做的是显示按月分组的播放次数。基本上我有两个问题: 我如何按月份将这些分组,并计算当月的播放次数 将这些信息从Django转换为D3可用的最佳方法是什么。 现在,我在这里查看了其他答案,并尝试了 这接近于我想要的信息,但是当我尝试将其输出到模板中时,它在月末

  • 问题内容: 我想将值传递给javascript。如果可能的话,我该怎么办?如何在后备bean中接收它们? 问题答案: