一、交互的数据格式——JSON
(摘录自百度百科——JSON)
json(JavaScript Object Notation):一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。
语法规则:在JS语言中一切都是对象,任何支持的类型都可以通过JSON来表示。
- 对象表示为键值对;
- 数据由逗号分隔;
- 花括号保存对象;
- 方括号保存数组;
JSON键值对是用来保存JS对象的一种方式,键名和值都用双引号(“”)包裹,中间隔着冒号(:)。
表示对象:
{"firstName": "Brett", "lastName": "McLaughlin"}
表示数组:
{
"people":[
{
"firstName": "Brett",
"lastName":"McLaughlin"
},
{
"firstName":"Jason",
"lastName":"Hunter"
}
]
}
二、ORM框架——简化对数据库的操作
ORM是Object-Relational Mapping的简写,对象-关系映射。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。业务实体在内存中表现为对象,在数据库中表现为关系数据,ORM系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
ORM框架为我们实际编程中操作、访问数据库提供了便利(有时候你甚至不知道自己用了这个框架,因为它不是像Django这样的框架,给程序员一个编程的流程)
在python中,ORM框架做了如下映射:
- 类——表;
- 类属性——字段;
- 类对象——数据库表里的一条数据
面向对象编程中,当对象的信息发生变化时我们需要把对象的信息保存在关系数据将尽快中,这需要较多的SQL语句来操作数据库(往往有较多的重复),使用ORM可以大大减少重复性的对数据库操作的代码。
字段类型有很多,不仅包括下面这些:
- CharField(max_length=字符长度):字符串——可用作表示标题;
- TextField:大文本字段,一般超过4000个字符时使用。
- DateTimeField:日期时间,包含参数auto_now_add,表示当对象第一次被创建时自动设置当前时间,用于创建时的时间戳,它总是使用当前日期,默认为false;参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于最后一次修改的时间戳,它总是使用当前日期,默认为false。
三、后端传递数据给前端
1、后台传递数据给HTML
传递的数据类型是一个字典,如:
from django.shortcuts import render
def example_for_view(request):
data = {'keyname':value}
return render(request,'urlpath',data)
然后前端模板中可以用双花括号(括号内为变量名, 即字典数据的键名)获取数据,如:
<p> {{ data }} </p>
2、后台传递数据给JS代码
这时需要注意,要传递的数据需要用json.dumps()处理,且前端使用这些数据时要用safe过滤器。
----后台----
import json
from Django.shortcuts import render
def example(request):
data = ['ele1','ele2']
return render(request,'urlpath',{'keyname':json.dumps(data),})
----前端JS代码----
var keyname= {{ keyname|safe }};
3、采用HttpResponse
上面的方式是直接渲染了一个新页面,也可以采用HttpResponse。HTTP协议的通信其实就是请求报文和响应报文之间的交互,其中请求报文是由客户端发出的,响应报文是由服务端生成的,HttpResponse便是Django里的响应报文。
其实HttpResponse是一个类。
HttpResponse的介绍我是摘录自此博文:
HttpResponse.__init__(content='', content_type=None, status=200, reason=None, charset=None)
- content:一个迭代器或者字符串。若为迭代器,则该函数立即处理这个迭代器,将其内容转成字符串并丢弃此迭代器。若需要迭代器到客户端的数据响应是数据流的形式则必须使用StreamingHttpResponse类代替。若该参数是一个字符串则这个字符串将作为相应报文的主体内容,也就是说如果这个参数是一个HTTP文档,那么这个文档将会放入响应报文的主体中最后在浏览器显示。
- content_type:用于指定MIME类型(MIME:多用途互联网邮件扩展类型,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问时浏览器会自动使用指定应用程序来打开)和编码。例如“text/html; charset=utf-8”,这两个值为默认值。
- status:响应状态码。200表示成功。一般不需要改变这个参数除非有特殊要求。
- reason:原因短语。客户端是根据状态码来判断响应是否成功,所以reason几乎没什么影响,一般只起提醒作用。默认的响应短语是200对于ok,404对应not found(状态码对应原因短语)。
- charset:在response中被编码的字符集,若无给定(也就是为None)则会从content_type中提取,若提取不成功则DEFAULT_CHARSET的设定将被使用。
----后台----
import json
from Django.http import HttpResponse,JsonResponse
def example(request):
data = {'keyname':value}
#这种形式下返回的数据仍是text/html类型
return HttpResponse(json.dumps(data))
#这种形式下返回的数据就是json类型了
return HttpResponse(json.dumps(data),content_type="application/json")
4、采用JsonResponse
JsonResponse提供了返回json数据的简单方式,它是HttpResponse的子类,用来帮助用户创建JSON编码的响应。
JsonResponse.__init__(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs)
- data:一般情况下是一个标准的python字典,与下面的参数safe配合使用时可以是其他数据类型的对象。
- encoder:默认为django.core.serializers.json.DjangoJSONEncoder,用于序列化data。
- safe:默认为True。若设置为False则可以传递任何对象给data进行序列化,否则只可以传递字典实例。
- json_dumps_params:在1.9版本中新增,可以传递一个python标准的 json 库中,json.dump() 方法处理后的对象给它,用于生成一个响应。
----后台----
import json
from Django.http import HttpResponse,JsonResponse
def example1(request):
data = {'keyname':value}
return JsonResponse(data)
def example2(request):
data = [ele1,ele2,...]
return JsonResponse(data,safe=False)
四、后端为前端提供接口
Django框架下我们定义了URL模式,编写了特定的视图函数,使得不同的URL对应其视图,这样就是编写了一个接口,前端可以在代码里访问我们的URL(需要运行服务器)。这个接口可能需要接收前端发来的数据(参数)并返回前端需要的数据。
一开始我们运行的是本地服务器,在测试项目时我们要同时开启前端服务器(端口号8080)和后端服务器(端口号8000),我们用浏览器登录前端服务器的端口,前端代码中设置浏览器发送请求到后端服务器。
即:浏览器上访问127.0.0.1:8080
五、Django的模型(model)
1、model中的class Meta
数据交互过程中我们经常需要查看数据库并对数据库中的数据进行必要的操作,而数据库存放的数据样式是由model中的类决定的,model中的类又经常带有Meta子类。
我觉得Meta子类可以看作是在设置一个model的内在属性。其包含了很多功能不同的选项,我们可以通过设置这些选项来完善model的属性与功能,如:
- app_label:只在“模型类不再默认的文件——models.py中”时使用,用于指定模型类属于哪个应用程序,app_label='appname'。
- verbose_name:给模型类定义一个别名;
- verbose_name_plural:给模型类定义别名的复数;
- 其他选项可以参考这篇博文。
2、什么是model
模型包含了我们的项目需要存储的数据的基本字段和属性,通常每个模型映射到一个数据库表。
我们自定义的每个模型都是django.db.models.Model的子类,模型的每个属性代表一个数据库字段。
因此模型是与数据库表对应的,要在数据库中存储数据我们必须创建对应的模型。
字段是模型最重要的一部分,每个字段都应该是Field类的实例,且都要采用一组特定于字段的参数。
有一些可用于所有字段类型的通用参数:
- null:null为True则将NULL在数据库中存储空值,默认为False;(数据库存储相关)
- blank:blank为True则允许该字段为空,默认为False;(验证相关)
- choices:一个包含多个元组的序列,若设置了这个则默认的表单小部件将是一个选择框。每个元组中第一个元素是将存储在数据库中的值
3、为什么在这里提Model
在前后端分离项目中,后端的任务就是对前端传来的数据进行操作或者为前端提供需要的数据,这经常需要我们利用数据库存取数据。model就是映射到数据库的表,决定了我们要存取什么数据到数据库,因此我觉得有必要提一下。
六、总结
根据近期做的小项目,我觉得前后端分离就是后端负责对前端的请求做出响应,为其提供不同功能的接口,前端根据后端提供的接口设计界面,数据通常用json格式传输。一开始学习Django时常常是定义URL——编写视图——编写模板,这需要在视图中采用render函数渲染界面,而在前后端分离中,负责后端的人只需要定义URL(提供接口),编写视图(如何处理前端发送过来的数据以及对前端的请求做出响应),视图的返回总是数据(如JsonResponse)。前端通过接口使用了视图的功能并接收其返回的数据,根据数据的内容再具体设计界面。