rest framework- view and routing - long-term maintenance

 

Be studied by a small project

###############   models.py    ###############

from django.db import models


class Publish(models.Model):
    name=models.CharField(max_length=32)
    email=models.EmailField()

    def __str__(self):
        return self.name


class Author(models.Model):
    name=models.CharField(max_length=32)
    age=models.IntegerField()
    def __str__(self):
        return self.name


class Book(models.Model):
    title=models.CharField(max_length=32)
    price=models.IntegerField()
    pub_date=models.DateField()
    publish=models.ForeignKey("Publish")
    authors=models.ManyToManyField("Author")
    def __str__(self):
        return self.title


class User(models.Model):
    name=models.CharField(max_length=32)
    pwd=models.CharField(max_length=32)
    type_choices=((1,"普通"),(2,"VIP"),(3,"SVIP"))
    user_type=models.IntegerField(choices=type_choices,default=1)


class Token(models.Model):
    user=models.OneToOneField("User")
    token=models.CharField(max_length=128)
    def __str__(self):
        return self.token

 

###############   serializers.py    ###############

from rest_framework import serializers
from api.models import *


class PublishModelSerializers(serializers.ModelSerializer):
    class Meta():
        model=Publish
        fields='__all__'

class AuthorModelSerializers(serializers.ModelSerializer):
    class Meta():
        model=Author
        fields='__all__'


class UserModelSerializers(serializers.ModelSerializer):
    class Meta():
        model=User
        fields='__all__'

class BookModelSerializers(serializers.ModelSerializer):
    class Meta():
        model=Book
        fields='__all__'

 

###############   views.py    ###############

from django.shortcuts import render
from api.serializer import PublishModelSerializers,AuthorModelSerializers,UserModelSerializers,BookModelSerializers
from rest_framework.views import APIView
from rest_framework.response import Response
from api import models
from api.utils import TokenAuth,SVIPPermission,VisitRateThrottle,MyPageNumberPagination


class Publisher(APIView):
    authentication_classes = [TokenAuth]
    permission_classes = [SVIPPermission]
    def get(self,request):
        publisher_all = models.Publish.objects.all()
        print(publisher_all)
        ps = PublishModelSerializers(publisher_all,many=True)
        return Response(ps.data)

    def post(self,request):
        ps = PublishModelSerializers(data=request.data)
        if ps.is_valid():
            ps.save()
            return Response(ps.data)
        else:
            return Response(ps.errors)

class PublisherDetail(APIView):
    def get(self,request,pk):
        publish = models.Publish.objects.filter(pk=pk).first()
        ps = PublishModelSerializers(publish)
        return Response(ps.data)

    def put(self,request,pk):
        publish = models.Publish.objects.filter(pk=pk).first()
        ps = PublishModelSerializers(publish,data=request.data)
        if ps.is_valid():
            ps.save()
            return Response(ps.data)
        else:
            return Response(ps.errors)

    def delete(self,request,pk):
        models.Publish.objects.filter(pk=pk).delete()
        return Response()


def get_random_str(user):
    import hashlib,time
    create_time =str(time.time())
    md5=hashlib.md5(bytes(user,encoding='utf8'))
    md5.update(bytes(create_time,encoding='utf8'))

    return md5.hexdigest()


class Login(APIView):
    authentication_classes = []
    def post(self,request):
        name=request.data.get('name')
        pwd = request.data.get('pwd')
        print(request.data)
        user= models.User.objects.filter(name=name,pwd=pwd).first()
        print(user)
        print(user.name)
        ret ={'status_code':100,'msg':None}

        if user:
            random_str = get_random_str(user.name)
            print(random_str)
            token=models.Token.objects.update_or_create(user=user,defaults={'token':random_str})
            ret['token']=str(token)
        else:
            ret['status_code']=1001
            ret [ 'mag'] = 'user name or password is incorrect "

        return Response(ret)


from rest_framework import mixins
from rest_framework import generics
from rest_framework import viewsets


# The first view, the use of mixins
class Author(mixins.ListModelMixin,mixins.CreateModelMixin,generics.GenericAPIView):
    authentication_classes = []
    queryset = models.Author.objects.all()
    serializer_class = AuthorModelSerializers

    def get(self,request,*args,**kwargs):
        return self.list(request,*args,**kwargs)

    def post(self,request,*args,**kwargs):
        return self.create(request,*args,**kwargs)


class AuthorDetail(mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,generics.GenericAPIView):
    authentication_classes = []
    queryset = models.Author.objects.all()
    serializer_class = AuthorModelSerializers

    def get(self,request,*args,**kwargs):
        return self.retrieve(request,*args,**kwargs)

    def put(self,request,*args,**kwargs):
        return self.update(request,*args,**kwargs)

    def delete(self,request,*args,**kwargs):
        return self.destroy(request,*args,**kwargs)


# The second view: the use of a common class-based view
class User(generics.ListCreateAPIView,generics.GenericAPIView):
    authentication_classes = []
    queryset = models.User.objects.all()
    serializer_class = UserModelSerializers


class UserDetail(generics.RetrieveUpdateDestroyAPIView,generics.GenericAPIView):
    queryset = models.User.objects.all()
    serializer_class = UserModelSerializers


# The third view: the two views are combined into a class, it would need to change the url as url or two now,

class Book(viewsets.ModelViewSet):
    # throttle_classes = [VisitRateThrottle]
    queryset = models.Book.objects.all()
    serializer_class = BookModelSerializers
    pagination_class = MyPageNumberPagination

 

###############   urls.py   ###############

from django.conf.urls import url,include
from django.contrib import admin


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api/(?P<version>\w+)/', include("api.urls")),
]

 

from django.conf.urls import url,include
from django.contrib import admin
from api import views


# But now there is a problem, as long as the future is not more than a table, you need two of the url?
# This has ten tables should write ten times, so you encapsulates the view class, you also need to look at the package routing,
# How packaging?
from rest_framework import routers
routers=routers.DefaultRouter()
routers.register("book",views.Book)
# Then have a table, you only need to register on it,
# This together with this one: routers.register ( "authors", views.AuthorModelView)


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^publish/$',views.Publisher.as_view()),
    url(r'^publish/(?P<pk>\d+)/$', views.PublisherDetail.as_view()),
    url(r'^login/$', views.Login.as_view()),
    url(r'^author/$', views.Author.as_view()),
    url(r'^author/(?P<pk>\d+)/$', views.AuthorDetail.as_view()),
    url(r'^user/$', views.User.as_view()),
    url(r'^user/(?P<pk>\d+)/$', views.UserDetail.as_view()),
    url(r'', include(routers.urls)),
    # url(r'^book/$', views.Book.as_view({"get":"list",'post':"create"})),
    # url(r'^book/(?P<pk>\d+)/$', views.Book.as_view({"get":"retrieve","put":"update","delete":"destroy"})),
]

 

###############   settings.py   ###############

REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":["api.utils.TokenAuth"],
    "DEFAULT_PERMISSION_CLASSES": ["api.utils.SVIPPermission"],
    'ALLOWED_VERSIONS': [ 'v1', 'v2'], # version allowed
    'VERSION_PARAM': 'version', # parameters
    'DEFAULT_VERSION': 'v1', # default version
}

 

Guess you like

Origin www.cnblogs.com/andy0816/p/12293723.html