django resetful framework
8346 단어 Django
서열화
queryset에 대한 서열화는 일반적으로 두 종류의serializers를 계승한다.Seriailzer와 Serializers.ModelSerializer
models.py
from django.db import models
# Create your models here.
class Article(models.Model):
title = models.CharField(max_length=32,unique=True, null=False)
desc = models.TextField()
create_time = models.DateTimeField(auto_now_add=True)
is_show = models.BooleanField(default=1)
author=models.ForeignKey(to='UserInfo',on_delete=models.CASCADE,default=1)
class Meta:
db_table = 'article'
class UserInfo(models.Model):
USER_TYPE = (
(1,' '),
(2,'VIP'),
(3,'SVIP')
)
user_type = models.IntegerField(choices=USER_TYPE)
username = models.CharField(max_length=32)
password = models.CharField(max_length=64)
class UserToken(models.Model):
user = models.OneToOneField(UserInfo,on_delete=models.CASCADE)
token = models.CharField(max_length=64)
serializers.py
# *****
# Serializer
# ModelSerializer Meta fields = ‘__all__’
#
# ModelSelrialzer depth=1
class Meta:
fields='__all__'
model = 'xxxxx'
depth = 1 2
#
# 1 def get_ (self,obj) -->obj
# 2 to_representation super().to_representation
#
# ******
# Django Form
from rest_framework import serializers
from app1.models import Article, UserInfo
class UserSerializer(serializers.Serializer):
#username=serializers.CharField(source='username')
username=serializers.CharField()
password=serializers.CharField()
user_type=serializers.CharField()
article=serializers.SerializerMethodField()
# article int
#
def get_article(self,obj):
res=obj.article_set.all()
serializer=ArticleSerializer(instance=res,many=True)
return serializer.data
class User2Serializer(serializers.ModelSerializer):
class Meta:
model = UserInfo
fields='__all__'
class ArticleSerializer(serializers.ModelSerializer):
# author=serializers.SerializerMethodField()
class Meta:
model = Article
fields="__all__"
# def get_author(self,obj):
# # data=UserSerializer(instance=obj.author,many=False).data #
# --
# res=User2Serializer(obj.author).data
# return res
# instance
def to_representation(self, instance):
data=super().to_representation(instance)
data['author']=User2Serializer(instance=instance.author,many=False).data
return data
class UserTokenSerializer(serializers.Serializer):
token=serializers.CharField()
username=serializers.CharField(source='user.username') #
인증
、
class XXX(APIView):
authentication_classes=[ ]
pass
BasicAuthentication
from rest_framework.authentication import BaseAuthentication
from rest_framework import exception
class UserAuth(BaseAuthentication):
#
def authenticate(self,request):
token=request.query_params.get('id')
# --
if not token:
raise exception.AuthenticationFailed({'code':900,'msg':‘ ’})
# user token
user_obj=
return user_obj,token ---- request.user=user_obj ( )
def authenticate_header(self, request):
pass
、
settings
REST_FRAMEWORK={
'DEFAULT_AUTHENTICATION_CLASSES':( views ,) --
}
사용 권한
인증과 차이가 많지 않지만 사용 권한의 전제는 인증을 사용해야 한다는 것을 생각해 보면 알 수 있습니다("Authentication credentials were not provided.")
、
class XXX(APIView):
permission_classes
BasicPermission
from rest_framework.permissions import BasePermission
from rest_framework import exceptions
exceptions.PermissionDenied
class UserPermission(BasePermission):
#
def has_permission(self,request,view):
return True #
return False #
、
settings
REST_FRAMEWORK={
'DEFAULT_PERMISSION_CLASSES':( views ,) --
}
지출을 절약하다
첫 번째 쓰기 상속BaseThrottle
from rest_framework.throttling import BaseThrottle
vist_data = {}
# ( )
class VisitThrottle(BaseThrottle):
''' 60s ( ip)''
history = None
def allow_request(self, request, view):
cur_time = time.time()
identify = self.get_ident(request)
if identify not in vist_data:
vist_data[identify] = []
vist_data[identify].append(cur_time)
return True
res = vist_data[identify]
self.history = res
if res:
if res[-1] + 60 > cur_time:
if len(res) < 3:
res.insert(0, cur_time)
return True
return False
else:
res.pop()
return True
else:
res.append(cur_time)
return True
#
def wait(self):
return 60 - (time.time() - self.history[-1])
두 번째 계승 SimpleRateThrottle
class VisitThrottle(SimpleRateThrottle):
#
# # scope get_cache_key
scope = 'NBA' # BaseThrottle scope
#
#
# def get_cache_key(self, request, view):
# # ip
# return self.get_ident(request)
settgins.py
'DEFAULT_THROTTLE_CLASSES': ('utils.throttle.VisitThrottle',),
# SimpleRateThrottle
"DEFAULT_THROTTLE_RATES":{
'NBA':'5/m', # 3/m,NBA scope
'NBAUser':'3/m', # 10/m,NBAUser scope
# NBA NBAUser APIView
}
페이지 나누기
제1식
class Pager1View(APIView):
def get(self,request,*args,**kwargs):
#
roles = models.Role.objects.all()
#
pg = PageNumberPagination()
#
page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
#
ser = PagerSerialiser(instance=page_roles,many=True)
return Response(ser.data)
settings.py는 반드시 페이지 나누기를 설정해야 합니다. 그렇지 않으면 []
REST_FRAMEWORK={
"PAGE_SIZE":2 #
}
두 번째 방식은 페이지 클래스 계승을 사용자 정의합니다
#
class MyPageNumberPagination(PageNumberPagination):
#
page_size = 3
# 3 , pager1/?page=2&size=4,
page_size_query_param = "size"
# 10
max_page_size = 10
#
page_query_param = "page"
class Pager1View(APIView):
def get(self,request,*args,**kwargs):
#
roles = models.Role.objects.all()
# , MyPageNumberPagination
pg = MyPageNumberPagination()
#
page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
#
ser = PagerSerialiser(instance=page_roles,many=True)
return Response(ser.data)
텍스트 링크http://www.cnblogs.com/derek1184405959/p/8727595.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.