一、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客户端。