天天看点

一、django-rest-framework—serializer

一、django-rest-framework基础知识

前言:RESTful是一种web服务的架构风格。

REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计

就是 RESTful

重点:restful的设计:https://blog.csdn.net/weixin_42134789/article/details/82782259

REST -- REpresentational State Transfer 直接翻译:表现层状态转移。
1. REST描述的是在网络中client和server的一种交互形式;URL定位资源,用HTTP动词
(GET,POST,DELETE,DETC)描述操作。REST本身不实用,实用的是如何设计 
RESTful API(REST风格的网络接口);
2.Server提供的RESTful API中,URL中只使用名词来指定资源,原则上不使用动词。“资源”是
REST架构或者说整个网络处理的核心。REST架构或者说整个网络处理的核心。
3.RESTful API 的设计以资源为核心,每一个 URI 代表一种资源。因此,URI 不能包含动词,只能
是名词,且个URI结尾不能加"/",注意的是,形容词也是可以使用的,但是尽量少用。

restful API的特点:
轻量,直接通过HTTP协议,不需要额外的协议;
面向资源,每一个URL代表一种资源,具有自解释性;
数据描述简单,一般通过JSON、xml做数据通信;
客户端根据不同的请求,通过不同的HTTP方法(get、post、delete、put),对服务器资源进行操作。
           

Django REST framework是一套基于Django的REST框架,是一个用于构建Web API

的功能强大且灵活的工具包。

1、安装djangorestframework

python -m pip install --upgrade pip

pip install djangorestframework

2、创建超级管理员的两种方式

1.python manage.py createsuperuser
然后根据提示输入用户名等
2.python manage.py --email [email protected] --username Lcoderfit
           

3、什么是序列化??

serializer:串行器:将复杂的数据结构变成json或者xml这个格式

1.什么是序列化:序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。
序列化,是指将复杂的QuerySet和Model类型转换成Python基本数据类型,从而将这些基本数据
类型以JSON的形式响应给客户端。

反序列化则和序列化相反,是指将Http请求中传入的JSON数据转换成复杂的数据类型,从而保存
在数据库中。
           

二、rest_framework.serializers.HyperlinkedModelSerializer(超链接model串行器)

1、示例,在APP下新建serializers.py文件

class ModelUserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = models.UserInfo	#models.py中的类
        fields = '__all__'  # '__all__'表示把所有字段都用来生成url
        # fields = ['name', 'pwd']  # 只显示字段
        # exclude = ['role',]	#删除的字段

class GroupSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Group
        fields = ('url', 'name')
           

2、auth:表示身份认证的意思

contrib:表示框架自带的功能

django.contrib.auth:django自带的身份认证模块

#用户类和组类
from django.contrib.auth.models import User, Group
           

三、序列化

snippets:片段 instance:实例 validated:已经验证的

1、后面加上app名称,对单独的app进行数据迁移

python manage.py makemigrations snippets

2、

# from snippets.models import Snippet
# from snippets.serializers import SnippetSerializer
# from rest_framework.renderers import JSONRenderer
# from rest_framework.parsers import JSONParser
           

3.用serializer表示实例

data表示python基本数据类型

4、ModelSerializer类没有做任何特别神奇的事情,它们只是创建序列化器类的快

捷方式,

自动确定的字段集。

create()和update()方法的简单默认实现。

5、pip install httpie

6.path(r’^a/int:b/$’,…):用转换器converter获取参数。int:b第一个参数叫转换器,

第二个参数是变量名

7、Serializers类进行序列化和反序列化的过程(以snippet这个app为例)

模型实例或查询集----python基本类型----json数据

from rest_framwork.renderers import JSONRenderer
from rest_framework.parsers import JSONParser

snippet=Snippet(code=...)

序列化:模型实例----serializer=SnippetSerializer(snippet)----》序列化
为python基本类型----content=JSONRender().render(serializer.data)----》渲染为json
数据。
反序列化:json数据:content----stream=io.BytesIO(content)----》转换为二进制流----
data=JSONParser().parse(stream)----》转换为python基本类型----
serializer=SnippetSerializer(data=data)---->将python基本类型转换为对象实例
反序列化之后进行数据验证: serializer.is_valid()
经过验证后的合法数据:serializer.validated_data
将更改执行到数据库:serializer.save()
注意:对查询集的序列化:serializer=SnippetSerializer(Snippet.objects.all(), many=True)
           

8、ModelSerializer:更方便的对model实例进行序列化操作。

class SnippetSerializer(serializer.ModelSerializer):
	class Meta:
		model = Snippet
		#fields元组中的元素对应Snippet类中的字段
		fields = ('id', 'title', 'code', 'linenos', 'language', 'style')    
重要的是要记住ModelSerializer类没有做任何特别神奇的事情,它们只是创建序列化器类的快捷方式:

1.自动确定的字段集。
2.create()和update()方法的简单默认实现   

打开django shell
from snippets.serializers import SnippetSerializer
serializer = SnippetSerializer()
print(repr(serializer))
           

9、from django.views.decorator.csrf import csrf_exempt

三、HTTP中GET和POST的区别

1、GET/POST都是TCP链接

1、最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。
2、GET产生一个TCP数据包;POST产生两个TCP数据包。
3、对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,
服务器响应200 ok(返回数据)。
           

2、五种HTTP方法,对应CRUD

GET:读取(Read)
POST:新建(Create)
PUT:更新(Update)
PATCH:更新(Update),通常是部分更新
DELETE:删除(Delete)

           

四、Django中的url和path

1.

from django.urls import path
from django.conf.urls import url

path('a/<int:b>/c/'):path要简单许多,但是path不支持正则表达式
url(r'^a/(\d)/c/$'):url()支持正则表达式
           

2、(?P)

‘(?P<name>…)’ 命名组
‘(?P’ 代表这是一个 Python 的语法扩展 ’<…>’ 里面是你给这个组起的名字,比如你可以给一个全部由数字组成的组叫做 ’num’ ,它的形式就是 ’(?P<num>/d+)’ 。起了名字之后,我们就可以在后面的正则式中通过名字调用这个组,它的形式是

‘(?P=name)’ 调用已匹配的命名组

要注意,再次调用的这个组是已被匹配的组,也就是说它里面的内容是和前面命名组里的内容是一样的。
           

3、httpie:可以使用httpie测试我们的API 。Httpie是一个用Python编写的用户友好的

http客户端。

继续阅读