标签:efi elm objects rate router and lib end setting
通过一个小项目来研究
############### 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‘]=‘用户名或密码错误‘
return Response(ret)
from rest_framework import mixins
from rest_framework import generics
from rest_framework import viewsets
# 第一种视图,使用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)
# 第二种视图:使用通用的基于类的视图
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
# 第三种视图:把两个视图类合并成一个, 那就需要改动url了,因为url现在还是两个,
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
# 但是现在有一个问题,以后是不是只要多一个表,就需要两个url了?
# 这样有十张表就要写十次了,所以你封装了视图类了,你也需要封装一下路由,
# 怎么封装?
from rest_framework import routers
routers=routers.DefaultRouter()
routers.register("book",views.Book)
# 再有一张表,就只需要注册就可以了,
# 这样再加这样一句: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_PARAM‘: ‘version‘, # 参数
‘DEFAULT_VERSION‘: ‘v1‘, # 默认版本
}
标签:efi elm objects rate router and lib end setting
原文地址:https://www.cnblogs.com/andy0816/p/12293723.html