什么是RESTful
REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”或“表现层状态转化”。
其实也就是一种协议 因为早期公司内部流动性比较大,有很多人员的流动 最开始没有规范 造成了它的代码 接手的人读起来 很费劲,所以 慢慢的有了这个规范来让大家的代码尽量同意起来 便于观看 有很大可观性
RESTful API设计
API与用户的通信协议
下面是很普遍的规范:
域名
https://api.example.com 尽量将API部署在专用域名
https://example.org/api/ API很简单
版本
1. 将版本信息放在URL中,如:https://api.example.com/v1/
2. 将版本信息放在请求头中。
路径
视网络上任何东西都是资源,均使用名词表示(可复数)
https://api.example.com/v1/zoos
https://api.example.com/v1/animals
https://api.example.com/v1/employees
method
GET :从服务器取出资源(一项或多项)
POST :在服务器新建一个资源
PUT :在服务器更新资源(客户端提供改变后的完整资源)
PATCH :在服务器更新资源(客户端提供改变的属性)
DELETE :从服务器删除资源
RESTful风格API介绍 RESTful这个时候需要用APIvew来使用
APIvew:
APIView其实就是继承了view但是又给view封装了一些 内容
我们使用APIVew的时候需要先导入:
from rest_framework.views import APIView
在settings中国导入rest_fromework 然后你的界面在浏览器显示的会更加美观
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', 'rest_framework' ]
APIVew会把我们的request给封装成 self.request._request这样我们的取值的部位也就是改变了
我们的request会变成rest framework封装好的request
def post(self,request): print(request) # <rest_framework.request.Request object at 0x00000247667607F0> print(self.request) #<rest_framework.request.Request object at 0x00000247667607F0> print(self.request._request.POST.get('age')) # 18 我们用postman发送的就是age 18所以获取到了
当你用CBV的时候你继承了APIVew然后你的信息这个时候被reset framework给封装成从self.request.data中取值了
APIView把我们原本的request给封装成 self.request._request 了 而我们内容处理 的值 也是在内部被封装成data内部了
校验字段:
我们可以再APIView中定义我们的序列化和字段进行对比的错误信息
其实就和我们的form组件一样的使用
做校验的时候你需要把你的值传递给data然后给校验类
rom first .models import Article,Tag,Comment,Add from rest_framework import serializers from rest_framework.validators import ValidationError class Commentserializer(serializers.ModelSerializer): # 用于做校验的钩子 类似与你的from的钩子 def validate_content(self, value): #其中的validata是必须写的 不变的 if '靠' in value: # return '您输入的不是正常交际用语' 这个只是把这个函数结束 raise ValidationError('您输入的不是正常交集用语') # 把这个错误抛出去 并且把这个界面结束 else: return value class Meta: model = Comment fields = "__all__" #depth = 1 # 这个如果使用的话你前端输入的必须要把关联的也要输入 不然 就会报错 extra_kwargs = { # extra_kwargs = {} 设置额外的错误信息 "content":{ "error_messages":{ "required":"内部不能为空" } }, "article":{ "error_messages":{ "required":"文章不能为空" } } }
validate_是你的钩子 后面加上你的字段
如果只是用validate就是一个全局钩子
views:
class Comment(APIView): def post(self,request): ret = {'code':0} print(self.request.data) comment_data = self.request.data # 取到你的数据 ser_obj = first_serializer.Commentserializer(data = comment_data) if ser_obj.is_valid(): # 这个就是正确表示 没有问题 ser_obj.save() else: # 数据有问题 ret['code'] = 1 ret['error'] = ser_obj.errors return JsonResponse(ret)
钩子的定义:
class Commentserializer(serializers.ModelSerializer): def validate_content(self,value): # 对你的Comment这个表中的contne进行错误信息设置 print(1111111111111) print(value) if '靠' in value: # return ValidationError('您输入的不是正常交际用语') # return '您输入的不合法' raise ValidationError('您输入的不合法') else: return value class Meta: model = Comment fields = "__all__" extra_kwargs = { # 额外的错误信息 "content":{ # content是你的 Comment表中的字段 "error_messages":{ # error_messages 是你的 错误的信息的提示 "required":"内容不能为空" # required是固定格式 } }, "article":{ "error_messages":{ "required":"文章不能为空" } } }
生成一个软连接
文章超链接序列化
class ArticleHyperLinkedSerializer(serializers.HyperlinkedModelSerializer): add = serializers.HyperlinkedIdentityField(view_name = 'add_detail', lookup_url_kwarg = 'id') #这个是view_name是指向你要跳转的别名 lookup_url_kwarg 是接收你的要跳转的那个连接之后的参数 class Meta: model = Article fields = ['id','title','type','add'] # 对地址序列化 class Addserializer(serializers.ModelSerializer): class Meta: model = Add fields = "__all__"
views:
class ArticlecleDetail(APIView): def get(self,request,pk): ret = {'code':0} article_obj = Article.objects.filter(pk = pk).first() ser_obj = first_serializer.ArticleHyperLinkedSerializer(article_obj,context={'request':request}) ret['data'] = ser_obj.data return JsonResponse(ret) class AddDetail(APIView): def get(self,request,id): ret = {'code':0} add_obj = Add.objects.filter(pk = id).first() ser_obj = first_serializer.Addserializer(add_obj,context = {'request':request}) # contentext = {} 是把你的 content给补全 ret ['data'] = ser_obj.data # 把所有的信息给返回出去 return JsonResponse(ret)