Django提供JsonAPI的步骤

AJAX的好处是利用JavaScript请求服务器并操作DOM,局部加载网页,不用重新刷新页面,提高了访问速率,增强了交互效果。坏处是搜索引擎在看源码的时候看不到。问题是Django如何提供json?

下面以付费软件库作json为示例

1. 定义数据库的表

修改models.py

#models.py
from django.db import models

class PaidSoftware(models.Model):
	wizard_name = models.CharField(max_length=300)
	description = models.CharField(max_length=500)
	official_url = models.URLField()
	attachment_url = models.URLField()

执行migrate生成Django需要的表

$ python manage.py migrate

修改admin.py

#admin.py
from django.contrib import admin
from .models import PaidSoftware

admin.site.register(PaidSoftware)

如何使用admin?

  • 确保'django.contrib.admin'在INSTALLED_APPS中,位于项目的settings.py
  • 确保admin.site.urls(from django.contrib import admin) include进url,位于项目的urls.py

设定好admin后,在后台添加几条记录

  • 软件的名称
  • 软件的描述
  • 软件的官方网址
  • 软件注册最重要的附件包的网址

在以上数据库都弄后以好,就是提供url接口了

2. 定义Url接口

需要修改

  • views.py
  • urls.py

修改views.py

利用JsonResponse返回Json数据, JsonResponse在safe=True的情况下要求data类型为dict

#views.py
from django.http import JsonResponse
from .models import PaidSoftware

def GetPaidSoftware(req):
	paidSoftware = PaidSoftware.objects.order_by('-id')
	software_list = []
	for s in paidSoftware:
		software_list.append({
			"wizard_name": s.wizard_name,
			"description": s.description,
			"official_url": s.official_url,
			"attachment_url": s.attachment_url
		})
	return JsonResponse({'softwares': software_list})

修改urls.py

使URI: "api/paidsoftware/" 指向views.GetPaidSoftware

尝试着访问该URI,应该能够返回数据库中所有的付费软件的信息,以JsonData的形式。

3. 前端操作JSON

在HTML页面中引入Jquery,和JS文件getpaidsoftware.js。

在getpaidsoftware.js中使用AJAX

/*getpaidsoftware.js*/
$.ajax({
	type: "get",
	url: "api/paidsoftware/",
	success: function(data){
		var softwares = data.softwares;
		$(softwares).each(function(index, software){
			var wizard_name = software.wizard_name;
			var description = software.description;
			var official_url = software.official_url;
			var attachment_url = software.attachment_url;

			//具体怎么使用每一款付费软件的注册信息
			console.log(wizard_name);
		});
	},
	error: function(){
		alert('load paid software error!');
	}
});

大功告成了吧。

警告:以上示例代码只是作为参考,并没有运行及测试,因而不能保证无错。


附:

view.py中也可以不使用JsonResponse(),而是使用HttpResponse()

因为:

An HttpResponse subclass that helps to create a JSON-encoded response.
It inherits most behavior from its superclass with a couple differences:

Its default Content-Type header is set to application/json.

The first parameter, data, should be a dict instance.
If the safe parameter is set to False (see below) it can be any JSON-serializable object.

    return HttpResponse({'data': data}, content_type='application/json')

参考[doc]: https://docs.djangoproject.com/en/1.8/ref/request-response/#jsonresponse-objects

--EOF--

关于本文如您有任何想法和意见,欢迎与我们联系,邮箱地址zhi@uqugu.com
您对本文有什么看法,喜欢或者不喜欢都可以发表意见。