1 版本

2 解释器

3.序列化

1 版本

通过?后面传版本号有两种方法:

方法一

from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.authentication import BasicAuthentication
from rest_framework.versioning import QueryParameterVersioning,URLPathVersioning,HostNameVersioning
from rest_framework.renderers import BrowsableAPIRenderer,JSONRenderer # Create your views here.
class UserView(APIView):
#版本号通过?后面传参数
def get(self,request,*args,**kwargs):
print('',request.version)
version=request.query_params.get('version')
if version=="v1":
ret={
"name":"Frank"
}
elif version=="v2":
ret={
"name":"Tom"
}
else:
ret='错误信息'
return Response(ret)

方法二:

versioning_class = QueryParameterVersioning#用这个的话,可以使用request.version来获取值

    def get(self, request, *args, **kwargs):
print('', request.version) if request.version == "v1":
ret = {
"name": "Frank5555"
}
elif request.version == "v2":
ret = {
"name": "Tom"
}
else:
ret = '错误信息'
return Response(ret)

把url放在里面:

 #版本号放在URL里面
# versioning_class = URLPathVersioning
#
# def get(self, request, *args, **kwargs):
# print('11111', request.version)
# from django.urls import reverse
# url=reverse(viewname="u",kwargs={"version":'v1'})#django生成的URl需要拼接
# # url=request.versioning_scheme.reverse(viewname='u',request=request)#反向生成URl,这个URL不需要拼接。
# print(url)
# if request.version == "v1":
# ret = {
# "name": "Frank5555"
# }
# elif request.version == "v2":
# ret = {
# "name": "Tom"
# }
# else:
# ret = '错误信息'
# return Response(ret)

子域名版本:

  versioning_class=HostNameVersioning
def get(self, request, *args, **kwargs):
# print('11111', request.version)
# print('222',request.versioning_scheme) if request.version == "v1":
ret = {
"name": "Frank5555"
}
elif request.version == "v2":
ret = {
"name": "Tom"
}
else:
ret = '错误信息'
return Response(ret)

上面的设置可以看成时在视图里面设置的。

也可以在全局设置:(只能使用一种)

REST_FRAMEWORK = {
'VERSION_PARAM':'version',
'DEFAULT_VERSION':'v1',
'ALLOWED_VERSIONS':['v1','v2'],
#'DEFAULT_VERSIONING_CLASS':"rest_framework.versioning.HostNameVersioning"
'DEFAULT_VERSIONING_CLASS':"rest_framework.versioning.URLPathVersioning"
}

2 解释器

文字解释:

请求的数据进行解析:请求体进行解析。表示服务端可以解析的数据格式的种类。

            Content-Type: application/url-encoding.....
request.body
request.POST Content-Type: application/json.....
request.body
request.POST#里面没有数据 客户端:
Content-Type: application/json
'{"name":"alex","age":123}' 服务端接收:
读取客户端发送的Content-Type的值 application/json parser_classes = [JSONParser,] 如果客户端的Content-Type的值和 application/json 匹配:JSONParser处理数据
如果客户端的Content-Type的值和 application/x-www-form-urlencoded 匹配:FormParser处理数据 配置:
单视图:
class UsersView(APIView):
parser_classes = [JSONParser,] 全局配置:
REST_FRAMEWORK = {
'VERSION_PARAM':'version',
'DEFAULT_VERSION':'v1',
'ALLOWED_VERSIONS':['v1','v2'],
# 'DEFAULT_VERSIONING_CLASS':"rest_framework.versioning.HostNameVersioning"
'DEFAULT_VERSIONING_CLASS':"rest_framework.versioning.URLPathVersioning",
'DEFAULT_PARSER_CLASSES':[
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
]
}

     

from django.shortcuts import render

# Create your views here.
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.authentication import BasicAuthentication
from rest_framework.versioning import QueryParameterVersioning,URLPathVersioning,HostNameVersioning
from rest_framework.parsers import JSONParser,FormParser
class UserView(APIView): def get(self,request,*args,**kwargs):
print('生活如此美好')
return Response(">>>>>fuck")
def post(self,request,*args,**kwargs):
#parser_classes = [JSONParser, ]这是局部的 #application/json
print('json',request._request.body)#里面放的时Json数据是b"xxxxx"
print('json',request._request.POST)#里面没有数据
print('json',request.data)
#www-form-url-encode
print('body',request._request.body)#字节的形式b'k1=v1&k2=v2'
print('post',request._request.POST)# <QueryDict: {'k1': ['v1'], 'k2': ['v2']}>
print('encode',request.data)
print(request.POST)
return Response('.......')

3.序列化

  rest framework序列化+From验证

   序列化:

          对象=》字符串  序列化

          字符串=》对象    反序列化

  目的:

     解决QuerySet序列化问题

用到了路由分发:

"""demo URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url,include
from django.contrib import admin urlpatterns = [
url(r'^admin/', admin.site.urls),
# url(r'^app01/(?P<version>[v1|v2]+)/', include('app01.urls')),
url(r'^app01/', include('app01.urls')),
url(r'^app02/', include('app02.urls')),
url(r'^app03/', include('app03.urls')),
url(r'^app05/', include('app05.urls')),
]

每个app里面的路由都是大同小异:

from django.conf.urls import url

from . import  views

urlpatterns = [

    url(r'^user/', views.UserView.as_view(),name='u'),

]

     a.基本操作:        

class UsersSerializer(serializers.Serializer):
name = serializers.CharField()
pwd = serializers.CharField() class UsersView(APIView):
def get(self,request,*args,**kwargs):
self.dispatch
# 方式一:
# user_list = models.UserInfo.objects.all().values('name','pwd','group__id',"group__title")
# return Response(user_list) # 方式二之多对象
# user_list = models.UserInfo.objects.all()
# ser = UsersSerializer(instance=user_list,many=True)
# return Response(ser.data) # 方式二之单对象
user = models.UserInfo.objects.all().first()
ser = UsersSerializer(instance=user, many=False)
return Response(ser.data)

b.跨表操作:

class UsersSerializer(serializers.Serializer):
name = serializers.CharField()
pwd = serializers.CharField()
group_id = serializers.CharField()
xxxx = serializers.CharField(source="group.title")
x1 = serializers.CharField(source="group.mu.name") class UsersView(APIView):
def get(self,request,*args,**kwargs):
self.dispatch
# 方式一:
# user_list = models.UserInfo.objects.all().values('name','pwd','group__id',"group__title")
# return Response(user_list) # 方式二之多对象
user_list = models.UserInfo.objects.all()
ser = UsersSerializer(instance=user_list,many=True)
return Response(ser.data)

c.复杂多对多操作(主要是多对多的显示)

方法一:


from django.shortcuts import render
from rest_framework.views import APIView from rest_framework.response import Response
from rest_framework.authentication import BasicAuthentication
from rest_framework.versioning import QueryParameterVersioning
from rest_framework import serializers
from rest_framework.request import Request
from . import models

class MyCharField(serializers.CharField):
def to_representation(self, value):
print(value)
data_list=[]
for row in value:
data_list.append(row.name)
return data_list class UsersSerializer(serializers.Serializer):
name = serializers.CharField()
pwd = serializers.CharField()
# group_id=serializers.CharField()
# xxxx=serializers.CharField(source="group.title")
# x1=serializers.CharField(source="group.mu.name")
x2=MyCharField(source="roles.all")#多对多建立方法就是更改显示的方式
class UserView(APIView):
def get(self, request, *args, **kwargs):
user_list = models.UserInfo.objects.all().first()
ser = UsersSerializer(instance=user_list, many=False) return Response(ser.data)

方法二:

class MyCharField(serializers.CharField):
def to_representation(self, value):
return {'id':value.pk,'name':value.name}
class UsersSerializer(serializers.Serializer):
name = serializers.CharField()
pwd = serializers.CharField()
# group_id=serializers.CharField()
# xxxx=serializers.CharField(source="group.title")
# x1=serializers.CharField(source="group.mu.name")
# x2=MyCharField(source="roles.all")#多对多建立方法就是更改显示的方式
x2=serializers.ListField(child=MyCharField(),source="roles.all")

方法三:(推荐使用这个方法因为可以自己修改和加约束条件)

class UsersSerializer(serializers.Serializer):
name = serializers.CharField()
pwd = serializers.CharField()
# group_id=serializers.CharField()
# xxxx=serializers.CharField(source="group.title")
# x1=serializers.CharField(source="group.mu.name")
# x2=MyCharField(source="roles.all")#多对多建立方法就是更改显示的方式
# x2=serializers.ListField(child=MyCharField(),source="roles.all")
x2=serializers.SerializerMethodField()
def get_x2(self,obj):
obj.roles.all()
role_list=obj.roles.filter(id__gt=1)
data_list=[]
for row in role_list:
data_list.append({'pk':row.pk,'name':row.name})
return data_list
以上三种都是使用相同的视图:

d.生成Modell时:

class UsersSerializer(serializers.ModelSerializer):
class Meta:
model=models.UserInfo
fields="__all__" class UserView(APIView):
def get(self, request, *args, **kwargs):
user_list = models.UserInfo.objects.all().all()
ser = UsersSerializer(instance=user_list, many=True) return Response(ser.data)

e.生成Ulr时:

class UsersSerializer(serializers.ModelSerializer):
group=serializers.HyperlinkedIdentityField(view_name='detail')
class Meta:
model=models.UserInfo
# fields="__all__"
fields=['name','pwd','group']
depth=1 class UserView(APIView):
def get(self, request, *args, **kwargs):
user_list = models.UserInfo.objects.all()
ser = UsersSerializer(instance=user_list, many=True,context={'request':request}) return Response(ser.data)

url为

from django.conf.urls import url

from . import  views

urlpatterns = [

    url(r'^user/', views.UserView.as_view(),name='u'),
url(r'^xxxx/(?P<pk>\d+)', views.UserView.as_view(),name='detail'),
url(r'^xxxx/(?P<pk>\d+)', views.UserView.as_view(),name='detail'),
url(r'^xxxx/(?P<pk>\d+)', views.UserView.as_view(),name='detail'),
]

f生成全局URL时:

class UsersSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model=models.UserInfo
fields="__all__"
# fields=['name','pwd','group']
# depth=1 class UserView(APIView):
def get(self, request, *args, **kwargs):
user_list = models.UserInfo.objects.all()
ser = UsersSerializer(instance=user_list, many=True,context={'request':request}) return Response(ser.data)

它的url:

from django.conf.urls import url

from . import  views

urlpatterns = [

    url(r'^user/', views.UserView.as_view(),name='u'),
# url(r'^xxxx/(?P<pk>\d+)', views.UserView.as_view(),name='detail'),
# url(r'^xxxx/(?P<pk>\d+)', views.UserView.as_view(),name='detail'),
# url(r'^xxxx/(?P<pk>\d+)', views.UserView.as_view(),name='detail'),
url(r'^xxxx/(?P<pk>\d+)', views.UserView.as_view(),name='userinfo-detail'),
url(r'^xxxx/(?P<pk>\d+)', views.UserView.as_view(),name='group-detail'),
url(r'^xxxx/(?P<pk>\d+)', views.UserView.as_view(),name='role-detail'), ]

数据验证有两种方式:

a.

class PasswordValidator(object):
def __init__(self,base):
self.base=base
def __call__(self, value):
if value !=self.base:
message='用户输入的值必须是%s'%self.base
raise serializers.ValidationError(message)
def set_context(self,serializer_field):
pass
class UserSeializer(serializers.Serializer):
name=serializers.CharField(min_length=6)
pwd=serializers.CharField(error_messages={'required':'密码不能为空'},validators=[PasswordValidator('')]) class UserView(APIView):
def get(self,request,*args,**kwargs):
user_list=models.UserInfo.objects.all()
ser=UserSeializer(instance=user_list,many=True,context={'request':request})
def post(self,request,*args,**kwargs):
ser=UserSeializer(data=request.data)
if ser.is_valid(): print(ser.validated_data)
else:
print(ser.errors)
return Response('.....')

b.

class PasswordValidator(object):
def __init__(self,base):
self.base=base
def __call__(self, value):
if value !=self.base:
message='用户输入的值必须是%s'%self.base
raise serializers.ValidationError(message)
def set_context(self,serializer_field):
pass
class UserSeializer(serializers.ModelSerializer):
class Meta:
model=models.UserInfo
fields="__all__"
extra_kwargs={
'name':{'min_length':6},
'pwd':{'validators':[PasswordValidator(666),]} } class UserView(APIView):
def get(self,request,*args,**kwargs):
user_list=models.UserInfo.objects.all()
ser=UserSeializer(instance=user_list,many=True,context={'request':request})
def post(self,request,*args,**kwargs):
ser=UserSeializer(data=request.data)
if ser.is_valid(): print(ser.validated_data)
else:
print(ser.errors)
return Response('.....')

Django REST framework之版本,解释器,序列化的更多相关文章

  1. Django REST framework 中文教程1:序列化

    建立环境 在我们做任何事情之前,我们将使用virtualenv创建一个新的虚拟环境.这将确保我们的包配置与我们正在开展的任何其他项目保持良好的隔离. virtualenv envsource env/ ...

  2. Django rest framework(6)----序列化

    目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...

  3. Django Rest framework 之 版本

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  4. day71:drf:API接口&Restful API规范&Django Rest Framework&drf中的序列化和反序列化功能

    目录 1.web应用模式 2.API接口 3.Restful API规范 4.序列化 5.Django Rest Framework 1.drf的简单介绍 2.drf的特点 3.如何安装drf 4.d ...

  5. Django rest framework 之版本

    一.通过 QueryParameterVersioning 获取版本 通过 QueryParameterVersioning 从 get 请求中获取版本信息: 1.新建 app,名为 api,Proj ...

  6. Django rest framework(6)----序列化(2)

    为什么要序列化 django 查询数据库返回的类型是  queryset 类型 而我们和前端通信使用的大多数是json类型,这个时候我们需要把 queryset的数据类型转换成python的数据类型然 ...

  7. Django rest framework源码分析(4)----版本

    版本 新建一个工程Myproject和一个app名为api (1)api/models.py from django.db import models class UserInfo(models.Mo ...

  8. Django Rest framework 之 序列化

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  9. Django rest framework(4)----版本

    目录 Django组件库之(一) APIView源码 Django restframework (1) ----认证 Django rest framework(2)----权限 Django res ...

随机推荐

  1. Django 学习笔记(三) --- HTML 模版加载 css、js、img 静态文件

    人生苦短 ~ Tips:仅适用于 Python 3+(反正差别不大,py2 改改也能用).因为据 Python 之父 Guido van Rossum 说会在 2020 年停止对 Python 2 的 ...

  2. MySQL 事务机制

    事务处理是保证数据安全的重要机制,事务有四个重要属性 ,根据它们的英文名称可以记为ACID: 原子性(Atomic): 事务操作是不可分割的; 事务只存在已执行和未执行两种状态,不存在只执行了部分指令 ...

  3. MyBatis从入门到放弃三:一对一关联查询

    前言 简单来说在mybatis.xml中实现关联查询实在是有些麻烦,正是因为起框架本质是实现orm的半自动化. 那么mybatis实现一对一的关联查询则是使用association属性和resultM ...

  4. Ocelot中文文档-Route

    路由(Routing) Ocelot主要功能是接收即将发来的请求并转发它们至下游服务.与此同时,以另一个http请求的形式(在将来这可能是任何传输的机制) Ocelot将一个请求的路由描述为另一个路由 ...

  5. 【Java深入研究】5、Proxy动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  6. 移动端meta整理

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...

  7. python爬虫简单代码爬取郭德纲单口相声

    搜索老郭的单口相声,打开检查模式,刷新 没有什么有价值的东东, 不过....清掉内容, 点击一个相声,再看看有些什么 是不是发现了些什么 我们来点击这个看看, 首先看一下headers, 这个url是 ...

  8. 解说css中的margin属性缩写方式

    <html> <body> <div style="border: 1px solid red;"> <div style="b ...

  9. 10折交叉验证(10-fold Cross Validation)与留一法(Leave-One-Out)、分层采样(Stratification)

    10折交叉验证 我们构建一个分类器,输入为运动员的身高.体重,输出为其从事的体育项目-体操.田径或篮球. 一旦构建了分类器,我们就可能有兴趣回答类似下述的问题: . 该分类器的精确率怎么样? . 该分 ...

  10. demo:动态生成专属二维码

    在日常生活中,随处可见二维码,那么js如何生成动态的专属二维码?其实,通过"二维码插件"我们可以快速生成二维码.在这,记录一下的生成专属二维码demo,一起来看看jquery.qr ...