你说的是 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 便捷方法,它将 GET 请求发送到 URL 并自动将响应解析为 JSON,将其转换为传递为的 Javascript 对象data
这里。第一个参数是请求将发送到的 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 响应。对此有一些提示:
-
The data
对象将一般来说是一个列表,即使只包含一项。如果您知道只有一项,则可以使用data[0]
。否则,使用 for 循环访问每个项目:
form (var i=0; i<data.length; i++) {
// do something with data[i]
}
-
If data
or data[i]
是一个对象(又名字典、哈希、键控数组等),您可以通过将键视为属性来访问键的值,即:
data[i].some_key
一般来说,处理 JSON 响应和 AJAX 时,通常最好先直接在浏览器中尝试,这样您就可以查看确切的响应和/或验证响应的结构。要在浏览器中查看 JSON 响应,您很可能需要扩展。 JSONView(适用于Firefox and Chrome)将使其能够理解 JSON 并像网页一样显示它。如果请求是 GET,您可以使用查询字符串以正常 GET 方式将数据传递到 URL,即http://mydomain.com/url/to/ajax/view/?some_data=foo
。如果是 POST,您将需要某种 REST 测试客户端。REST客户端是一个很好的 Firefox 插件。对于 Chrome,你可以尝试Postman。这些也非常适合学习 Twitter、Facebook 等的第 3 方 API。