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

Posted

技术标签:

【中文标题】将信息从 javascript 传递到 django 应用程序并返回【英文标题】:Pass information from javascript to django app and back 【发布时间】:2012-07-30 13:10:16 【问题描述】:

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

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

谢谢,

【问题讨论】:

这只是标准的 Django url/view 代码。在这种情况下,Ajax 请求与普通请求没有什么不同。 尽管(正因为如此)是一个关于 AJAX 和 Django 的基本问题,但我发现这个问题非常有用。这种“如何开始”的问题在 *** 中很难找到(即使在基本的阅读和学习教程中),并且为新手节省了很多精力。谢谢 xhassassin! 【参考方案1】:

您说的是 AJAX。 AJAX 总是需要 3 个部分(从技术上讲,只有两个:javascript 具有双重功能)。

    客户端(本例中为 Javascript)发出请求 服务器(本例中为 Django 视图)处理请求并返回响应 客户端(同样是 Javascript)接收响应并对其进行处理

您还没有指定首选的框架,但是如果没有某种 Javascript 框架来做 AJAX 会很疯狂,所以我将为您选择 jQuery。该代码可以很容易地适应任何 Javascript 框架:

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

我正在使用$.getJSON,这是一种 jQuery 便捷方法,它向 URL 发送 GET 请求并自动将响应解析为 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 数据结构(列表、字典等)。如果要返回 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 响应。一些提示:

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

    form (var i=0; i<data.length; i++) 
        // do something with data[i]
    
    

    如果 datadata[i] 是一个对象(AKA 字典、哈希、键控数组等),您可以通过将键视为属性来访问键的值,即:

    data[i].some_key
    

    在处理 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 等学习 3rd-party API。

【讨论】:

好答案!但请注意,django.utils.simplejson 在 Django 1.5+ 中已弃用,如 Django 1.5 release notes 所述 docs.djangoproject.com/en/1.10/releases/1.5/…【参考方案2】:

关于如何从 ajax 请求/url 中捕获信息,通常您可以像在普通 django 请求中那样执行此操作,请查看 url dispatcher docs 并阅读官方文档中的 django 视图。

关于如何返回响应,只需捕获参数,处理您的请求,然后使用适当的模拟类型给出您的响应。

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

【讨论】:

【参考方案3】:

是的,这是可能的。如果您将 id 作为参数传递给您将在应用程序中使用的视图,例如: def example_view (request,id) 在 urls.py 中,您可以使用如下内容: url(r'^example_view/(?P&lt;id&gt;\d+)/', 'App.views.example_view')

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

【讨论】:

哈哈,谢谢。是的,我只需要 ?P 东西,我在这里问几分钟后就在 django 教程中找到了它。

以上是关于将信息从 javascript 传递到 django 应用程序并返回的主要内容,如果未能解决你的问题,请参考以下文章

在 WooCommerce 结帐时将产品详细信息从订单传递到 jQuery/javascript

如何将 MB 的数据从 PHP 传递到 Javascript [关闭]

如何在模板中将数据从 Flask 传递到 JavaScript?

将数组从 EJS 传递到 Javascript

将变量从 Flask 传递到 JavaScript

如何将数据从javascript传递到json