用drf编写
'''
1 有车型(CarModel),车厂(CarFactory),经销商(Distributor)三个表,
一个车厂可以生产多种车型,一个经销商可以出售多种车型,一个车型可以有多个经销商出售车型:车型名,车型出厂价,车厂id车厂:车厂名,车厂地址,联系电话经销商:经销商名,地址,联系电话
2 有用户表,基于django内置user表,扩展mobile字段
3 编写登陆接口,jwt方式返回token,格式为{status:100,msg:登陆成功,token:safasdfa}
4 所有接口(除登录外),必须登录后才能访问
5 管理员登陆后可以增,删,单查,群查,改 车型,车厂,经销商(具备所有接口权限)
6 普通用户登陆可以查看车型,车厂,经销商单条,所有(只有查看权限)
7 所有查询所有接口带分页功能
8 查询所有车型接口,可以按车型名字精准过滤加分项:
用户注册接口
管理员有用户锁定,删除用户功能
'''
models.py
from django. db import modelsfrom django. contrib. auth. models import AbstractUserclass User ( AbstractUser) : mobile = models. CharField( max_length= 32 , verbose_name= '联系电话' )
class CarModel ( models. Model) : name = models. CharField( max_length= 32 , verbose_name= '车型名' ) init_price = models. IntegerField( verbose_name= '出厂价' ) factory = models. ForeignKey( to= 'CarFactory' , on_delete= models. CASCADE, verbose_name= '车厂id' ) distributors = models. ManyToManyField( to= 'Distributor' , verbose_name= '经销商' ) class Meta : verbose_name_plural = '经销商表' def __str__ ( self) : return self. namedef factory_info ( self) : '''车厂信息''' return { 'name' : self. factory. name, 'addr' : self. factory. addr, 'mobile' : self. factory. mobile} def distributor_info ( self) : '''经销商信息''' distributor_info_list = [ ] for distributor in self. distributors. all ( ) : distributor_info_list. append( { 'name' : distributor. name, 'addr' : distributor. addr, 'mobile' : distributor. mobile} ) return distributor_info_list
class CarFactory ( models. Model) : name = models. CharField( max_length= 32 , verbose_name= '车厂名' ) addr = models. CharField( max_length= 32 , verbose_name= '车厂地址' ) mobile = models. CharField( max_length= 32 , verbose_name= '联系电话' ) class Meta : verbose_name_plural = '经销商表' def __str__ ( self) : return self. name
class Distributor ( models. Model) : name = models. CharField( max_length= 32 , verbose_name= '经销商名' ) addr = models. CharField( max_length= 32 , verbose_name= '地址' ) mobile = models. CharField( max_length= 32 , verbose_name= '联系电话' ) class Meta : verbose_name_plural = '经销商表' def __str__ ( self) : return self. name
新建一个jwt_response.py验证登录
def jwt_response_payload_handler ( token, user, request) : return { 'code' : 100 , 'msg' : '登录成功' , 'token' : token}
新建一个exceptions.py验证错误
from rest_framework. views import exception_handler
from rest_framework. response import Responsedef common_exception ( exc, context) : res = exception_handler( exc, context) if not res: return Response( { 'code' : 999 , 'msg' : f'非drf错误,错误信息是: { str ( exc) } ' } ) return Response( { 'code' : 666 , 'msg' : f'这是drf错误,错误信息是: { res. data. get( "detail" ) } ' } )
settings.py配置文件中
JWT_AUTH = { 'JWT_RESPONSE_PAYLOAD_HANDLER' : 'app01.jwt_response.jwt_response_payload_handler' , 'JWT_EXPIRATION_DELTA' : datetime. timedelta( days= 1 )
} REST_FRAMEWORK = { 'EXCEPTION_HANDLER' : 'app01.exceptions.common_exception' ,
}
新建page.py分页
from rest_framework. pagination import PageNumberPaginationclass MyPageNumberPagination ( PageNumberPagination) : page_size = 3 max_page_size = 5
新建serializer.py分页
from rest_framework import serializersfrom app01. models import User, CarModel, CarFactory, Distributorclass UserSerializer ( serializers. ModelSerializer) : class Meta : model = Userfields = [ 'username' , 'password' , 'mobile' ] extra_kwargs = { 'password' : { 'write_only' : True } } def create ( self, validated_data) : user = User. objects. create_user( ** validated_data) return userclass CarModelSerializer ( serializers. ModelSerializer) : class Meta : model = CarModelfields = [ 'id' , 'name' , 'init_price' , 'factory' , 'distributors' , 'factory_info' , 'distributor_info' ] extra_kwargs = { 'factory' : { 'write_only' : True } , 'distributors' : { 'write_only' : True } , 'factory_info' : { 'read_only' : True } , 'distributor_info' : { 'read_only' : True } , } class CarFactorySerializer ( serializers. ModelSerializer) : class Meta : model = CarFactoryfields = '__all__' class DistributorSerializer ( serializers. ModelSerializer) : class Meta : model = Distributorfields = '__all__'
新建permission.py权限
from rest_framework. permissions import BasePermission
from rest_framework. exceptions import AuthenticationFailedclass MyPermission ( BasePermission) : def has_permission ( self, request, view) : print ( view. action) if not request. user. is_superuser and request. method != 'GET' : raise AuthenticationFailed( '普通用户,权限不足' ) return True
views.py视图中
from rest_framework. viewsets import ViewSet
from rest_framework. generics import GenericAPIView
from rest_framework. mixins import CreateModelMixinfrom . models import User
from . serializer import UserSerializerfrom rest_framework. response import Responseclass UserView ( ViewSet, GenericAPIView, CreateModelMixin) : queryset = User. objects. all ( ) serializer_class = UserSerializerdef create ( self, request, * args, ** kwargs) : ser = self. get_serializer( data= request. data) if ser. is_valid( ) : ser. save( ) return Response( { 'code' : 100 , 'msg' : '注册成功' , 'result' : ser. data} ) return Response( { 'code' : 101 , 'msg' : '注册失败' , 'result' : ser. errors} ) from rest_framework. mixins import DestroyModelMixin
from rest_framework_jwt. authentication import JSONWebTokenAuthentication
from rest_framework. permissions import IsAuthenticated, IsAdminUser
from rest_framework. decorators import actionclass AdminView ( ViewSet, GenericAPIView, DestroyModelMixin) : queryset = User. objects. all ( ) authentication_classes = [ JSONWebTokenAuthentication] permission_classes = [ IsAuthenticated, IsAdminUser] @action ( methods= [ 'DELETE' ] , detail= True ) def delete_user ( self, request, * args, ** kwargs) : return self. destroy( request, * args, ** kwargs) @action ( methods= [ 'GET' ] , detail= True ) def lock ( self, request, * args, ** kwargs) : user = self. get_object( ) if user is None : return Response( { 'code' : 101 , 'msg' : '用户不存在' } ) if user. is_active: user. is_active = False user. save( ) return Response( { 'code' : 100 , 'msg' : '用户锁定成功' } ) return Response( { 'code' : 102 , 'msg' : '用户已经被锁定' } ) @action ( methods= [ 'GET' ] , detail= True ) def unlock ( self, request, * args, ** kwargs) : user = self. get_object( ) if user is None : return Response( { 'code' : 101 , 'msg' : '用户不存在' } ) if user. is_active is False : user. is_active = True user. save( ) return Response( { 'code' : 100 , 'msg' : '用户解锁成功' } ) return Response( { 'code' : 102 , 'msg' : '用户已经解锁过了' } ) from rest_framework. viewsets import ModelViewSetfrom . models import CarModel
from . serializer import CarModelSerializer
from . permissions import MyPermission
from . page import MyPageNumberPaginationfrom django_filters. rest_framework import DjangoFilterBackendclass CarModelView ( ModelViewSet) : queryset = CarModel. objects. all ( ) serializer_class = CarModelSerializerauthentication_classes = [ JSONWebTokenAuthentication] permission_classes = [ IsAuthenticated, MyPermission] pagination_class = MyPageNumberPaginationfilter_backends = [ DjangoFilterBackend] filterset_fields = [ 'name' ] from . models import CarFactory
from . serializer import CarFactorySerializerclass CarFactoryView ( ModelViewSet) : queryset = CarFactory. objects. all ( ) serializer_class = CarFactorySerializerpagination_class = MyPageNumberPaginationauthentication_classes = [ JSONWebTokenAuthentication] permission_classes = [ IsAuthenticated, MyPermission] from . models import Distributor
from . serializer import DistributorSerializerclass DistributorView ( ModelViewSet) : queryset = Distributor. objects. all ( ) serializer_class = DistributorSerializerpagination_class = MyPageNumberPaginationauthentication_classes = [ JSONWebTokenAuthentication] permission_classes = [ IsAuthenticated, MyPermission]
urls.py路由中
from django. contrib import admin
from django. urls import path, includefrom rest_framework_jwt. views import obtain_jwt_tokenfrom rest_framework. routers import SimpleRouterfrom app01. views import UserView, AdminView, CarModelView, CarFactoryView, DistributorViewrouter = SimpleRouter( ) router. register( 'user' , UserView, 'user' )
router. register( 'admin' , AdminView, 'admin' ) router. register( 'carMode' , CarModelView, 'carMode' )
router. register( 'carFactory' , CarFactoryView, 'carFactory' )
router. register( 'distributor' , DistributorView, 'distributor' ) urlpatterns = [ path( 'login/' , obtain_jwt_token) , path( '' , include( router. urls) )
]