用drf編寫
'''
1 有車型(CarModel),車廠(CarFactory),經(jīng)銷商(Distributor)三個表,
一個車廠可以生產(chǎn)多種車型,一個經(jīng)銷商可以出售多種車型,一個車型可以有多個經(jīng)銷商出售車型:車型名,車型出廠價,車廠id車廠:車廠名,車廠地址,聯(lián)系電話經(jīng)銷商:經(jīng)銷商名,地址,聯(lián)系電話
2 有用戶表,基于django內(nèi)置user表,擴(kuò)展mobile字段
3 編寫登陸接口,jwt方式返回token,格式為{status:100,msg:登陸成功,token:safasdfa}
4 所有接口(除登錄外),必須登錄后才能訪問
5 管理員登陸后可以增,刪,單查,群查,改 車型,車廠,經(jīng)銷商(具備所有接口權(quán)限)
6 普通用戶登陸可以查看車型,車廠,經(jīng)銷商單條,所有(只有查看權(quán)限)
7 所有查詢所有接口帶分頁功能
8 查詢所有車型接口,可以按車型名字精準(zhǔn)過濾加分項:
用戶注冊接口
管理員有用戶鎖定,刪除用戶功能
'''
models.py
from django. db import modelsfrom django. contrib. auth. models import AbstractUserclass User ( AbstractUser) : mobile = models. CharField( max_length= 32 , verbose_name= '聯(lián)系電話' )
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= '經(jīng)銷商' ) class Meta : verbose_name_plural = '經(jīng)銷商表' 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) : '''經(jīng)銷商信息''' 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= '聯(lián)系電話' ) class Meta : verbose_name_plural = '經(jīng)銷商表' def __str__ ( self) : return self. name
class Distributor ( models. Model) : name = models. CharField( max_length= 32 , verbose_name= '經(jīng)銷商名' ) addr = models. CharField( max_length= 32 , verbose_name= '地址' ) mobile = models. CharField( max_length= 32 , verbose_name= '聯(lián)系電話' ) class Meta : verbose_name_plural = '經(jīng)銷商表' 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權(quán)限
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( '普通用戶,權(quán)限不足' ) 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' : '用戶已經(jīng)被鎖定' } ) @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' : '用戶已經(jīng)解鎖過了' } ) 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) )
]