利用rest-framework编写逻辑关系 1.设置路由 urls.py 2.views.py 3.局部添加添加认证和权限组件

from django.conf.urls import url,include
from django.contrib import admin
from rest_framework import routers
from app01 import views
##实例化routers,将请求路径和执行函数注册到routers中
routers=routers.DefaultRouter()
routers.register("authors",views.AuthorModelView)
routers.register("book",views.BookModelView)
routers.register("publish",views.PublishModelView)
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    #进行路由分发
    url(r"^", include(routers.urls)),
    ]

2.views.py

from app01 import models
from rest_framework.serializers import ModelSerializer
from rest_framework.viewsets import ModelViewSet
class BookModelSerializers(ModelSerializer):
    class Meta:
        model=models.Book
        fields="__all__"
class PublishModelSerializers(ModelSerializer):
    class Meta:
        model = models.Publish
        fields = "__all__"
class AuthorModelSerializers(ModelSerializer):
    class Meta:
        model = models.Author
        fields = "__all__"
class BookModelView(ModelViewSet):
    ##queryset和serializer_class这两个变量名不能变
    queryset=models.Book.objects.all()
    serializer_class = BookModelSerializers
class PublishModelView(ModelViewSet):
    ##queryset和serializer_class这两个变量名不能变
    queryset = models.Publish.objects.all()
    serializer_class = PublishModelSerializers
class AuthorModelView(ModelViewSet):
    ##queryset和serializer_class这两个变量名不能变
    queryset = models.Author.objects.all()
    serializer_class = AuthorModelSerializers

3.局部添加添加认证和权限组件

新建service文件夹,将认证,权限,(访问频率)组件的逻辑关系放到这个文件夹中

auth.py 认证逻辑关系

from rest_framework import HTTP_HEADER_ENCODING, exceptions
from rest_framework.exceptions import AuthenticationFailed
from rest_framework.authentication import BaseAuthentication
from rest_framework.authentication import SessionAuthentication
from app01.models import UserToken

class AuthUser(BaseAuthentication): #类名可以随便器
    def authenticate(self,request): #函数名只能是这个
       token=request.GET.get("token")
       token_obj=UserToken.objects.filter(token=token).first()
       if token_obj:
           return token_obj.users.name,token   #返回元祖
       else:
           raise AuthenticationFailed  #抛出异常

permission.py 权限逻辑关系

from app01.models import UserToken
from app01.models import UserToken
from rest_framework.permissions import BasePermission

class SVIPpermission(BasePermission):
    message="您没有权限访问该资源"
    def has_permission(self,request,obj):
        # print(request.user)
        # print(request.auth)
        token_obj=UserToken.objects.filter(token=request.auth).first()
        if token_obj.users.role in [2,3]:
            return True
        else:
            return False

throttle.py 访问频率

from rest_framework.throttling import BaseThrottle
VISIT_RECORD={}
class VisitThrottle(BaseThrottle):
    def __init__(self):
        self.history=None

    def allow_request(self,request,view):
        remote_addr = request.META.get('REMOTE_ADDR')
        print(remote_addr)
        import time
        ctime=time.time()

        if remote_addr not in VISIT_RECORD:
            VISIT_RECORD[remote_addr]=[ctime,]
            return True

        history=VISIT_RECORD.get(remote_addr)
        self.history=history

        while history and history[-1]<ctime-60:
            history.pop()

        if len(history)<3:
            history.insert(0,ctime)
            return True
        else:
            return False

    def wait(self):
        import time
        ctime=time.time()
        return 60-(ctime-self.history[-1])

views.py

from app01.service.auth import *
from app01.service.permission import *
from app01.service.throttle import *
##分页设置函数
from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination
from rest_framework.parsers import JSONParser,FormParser
#响应器设置,JSONRenderer页面只以json字符串显示,没有样式
from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
class MyPageNumberPagination(PageNumberPagination):
    page_size = 1
    page_size_query_param="size"
    max_page_size=2
class AuthorModelView(ModelViewSet):
    queryset = models.Author.objects.all()
    serializer_class = AuthorModelSerializers
    #添加认证组件
    authentication_classes = [AuthUser]
    #添加权限组件
    permission_classes = [SVIPpermission]
    #throttle(访问频率)组件
    throttle_classes = [VisitThrottle]
    #分页
    pagination_class = MyPageNumberPagination
    #数据解析器
    parser_classes = [JSONParser]
    #响应器
    renderer_classes = [JSONRenderer,BrowsableAPIRenderer ]
View Code

4.全局设置

在setting.py中设置
REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":(
          "app01.service.auth.AuthUser",
    ),
    "DEFAULT_PERMISSION_CLASSES":(
        "app01.service.permission.SVIPpermission",
    ),
    "DEFAULT_THROTTLE_CLASSES":(
        "app01.service.throttle.VisitThrottle",
    ),
    "DEFAULT_PARSER_CLASSES":('rest_framework.parsers.FormParser',),
    "DEFAULT_RENDERER_CLASSES":('rest_framework.renderers.JSONRenderer'),

}