需求

  1. 1 有车型(CarModel),车厂(CarFactory),经销商(Distributor)三个表,一个车厂可以生产多种车型,一个经销商可以出售多种车型,一个车型可以有多个经销商出售
  2. 车型:车型名,车型出厂价,车厂id
  3. 车厂:车厂名,车厂地址,联系电话
  4. 经销商:经销商名,地址,联系电话
  5. 2 有用户表,基于django内置user表,扩展mobile字段
  6. 3 编写登陆接口,jwt方式返回token
  7. 格式为{status:100,msg:登陆成功,tokensafasdfa}
  8. 3 有管理员登陆后可以新增,删除车型,车厂,经销商
  9. 2 普通用户登陆可以查看车型(群查分页,单查)
  10. 查车型:返回车型信息,车厂名字,经销商名字和电话
  11. 加分项:
  12. 用户注册接口
  13. 管理员有用户锁定,删除功能

settings.py

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. 'rest_framework',
  9. 'rest_framework_jwt',
  10. 'app01',
  11. ]
  12. AUTH_USER_MODEL = 'app01.UserInfo'
  13. import datetime
  14. JWT_AUTH = {
  15. # 'JWT_RESPONSE_PAYLOAD_HANDLER': 'app01.utils.jwt_response_payload_handler',
  16. 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),
  17. }

views.py

  1. from django.contrib import auth
  2. from rest_framework.generics import ListAPIView, RetrieveAPIView, CreateAPIView, UpdateAPIView, \
  3. DestroyAPIView
  4. from rest_framework.viewsets import ViewSet, ViewSetMixin, GenericViewSet
  5. from .permissions import AdminPermission
  6. from .serializers import CarModelSerializer, CarFactorySerializer, DistributorSerializer
  7. from .models import CarModel, CarFactory, Distributor, UserInfo
  8. from rest_framework.decorators import action
  9. from rest_framework_jwt.settings import api_settings
  10. from rest_framework.response import Response
  11. from .authenticate import JsonWebTokenAuthentication
  12. from .page import CommonCursorPagination
  13. jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
  14. jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
  15. # 车型
  16. class CarModelView(ViewSetMixin, ListAPIView, RetrieveAPIView):
  17. serializer_class = CarModelSerializer
  18. queryset = CarModel.objects.all()
  19. authentication_classes = [JsonWebTokenAuthentication, ]
  20. pagination_class = CommonCursorPagination
  21. class CarModelDetailView(ViewSetMixin, CreateAPIView, UpdateAPIView, DestroyAPIView):
  22. serializer_class = CarModelSerializer
  23. queryset = CarModel.objects.all()
  24. authentication_classes = [JsonWebTokenAuthentication, ]
  25. permission_classes = [AdminPermission, ]
  26. pagination_class = CommonCursorPagination
  27. # 车厂
  28. class CarFactoryView(ViewSetMixin, ListAPIView, RetrieveAPIView):
  29. serializer_class = CarFactorySerializer
  30. queryset = CarFactory.objects.all()
  31. authentication_classes = [JsonWebTokenAuthentication, ]
  32. pagination_class = CommonCursorPagination
  33. class CarFactoryDetailView(ViewSetMixin, CreateAPIView, UpdateAPIView, DestroyAPIView):
  34. serializer_class = CarFactorySerializer
  35. queryset = CarFactory.objects.all()
  36. authentication_classes = [JsonWebTokenAuthentication, ]
  37. permission_classes = [AdminPermission, ]
  38. pagination_class = CommonCursorPagination
  39. # 经销商
  40. class DistributorView(ViewSetMixin, ListAPIView, RetrieveAPIView):
  41. serializer_class = DistributorSerializer
  42. queryset = Distributor.objects.all()
  43. authentication_classes = [JsonWebTokenAuthentication, ]
  44. pagination_class = CommonCursorPagination
  45. class DistributorDetailView(ViewSetMixin, CreateAPIView, UpdateAPIView, DestroyAPIView):
  46. serializer_class = DistributorSerializer
  47. queryset = Distributor.objects.all()
  48. authentication_classes = [JsonWebTokenAuthentication, ]
  49. permission_classes = [AdminPermission, ]
  50. pagination_class = CommonCursorPagination
  51. class LoginView(ViewSet):
  52. @action(methods=['POST'], detail=False)
  53. def login(self, request, *args, **kwargs):
  54. username = request.data.get('username')
  55. password = request.data.get('password')
  56. user = auth.authenticate(request, username=username, password=password)
  57. if user:
  58. # 登录成功,签发token
  59. # 通过user得到payload
  60. payload = jwt_payload_handler(user)
  61. # 通过payload得到token
  62. token = jwt_encode_handler(payload)
  63. return Response({'code': 1000, 'msg': '登录成功', 'token': token})
  64. else:
  65. return Response({'code': 1001, 'msg': '用户名或密码错误'})
  66. # 注册接口
  67. class RegisterView(ViewSet, CreateAPIView):
  68. @action(methods=['POST'], detail=False)
  69. def register(self, request, *args, **kwargs):
  70. username = request.data.get('username')
  71. password = request.data.get('password')
  72. user = UserInfo.objects.filter(username=username).first()
  73. if user:
  74. return Response({'code': 1000, 'msg': '用户名已存在'})
  75. else:
  76. UserInfo.objects.create_user(username=username, password=password)
  77. return Response({'code': 1001, 'msg': '注册成功'})

urls.py


  1. from django.contrib import admin
  2. from django.urls import path
  3. from rest_framework.routers import SimpleRouter
  4. from app01 import views
  5. router = SimpleRouter()
  6. # 车型
  7. router.register('api/v1/car_model', views.CarModelView, 'car_model')
  8. router.register('api/v1/car_model_admin', views.CarModelDetailView, 'car_model_admin')
  9. # 车厂
  10. router.register('api/v1/car_factory', views.CarFactoryView, 'car_factory')
  11. router.register('api/v1/car_factory_admin', views.CarFactoryDetailView, 'car_factory_admin')
  12. # 经销商
  13. router.register('api/v1/distributor', views.DistributorView, 'distributor')
  14. router.register('api/v1/distributor_admin', views.DistributorDetailView, 'distributor_admin')
  15. # 登录
  16. router.register('api/v1', views.LoginView, '')
  17. # 注册
  18. router.register('api/v1/user', views.RegisterView, 'user')
  19. urlpatterns = [
  20. path('admin/', admin.site.urls),
  21. ]
  22. urlpatterns += router.urls

serializers.py

  1. from rest_framework import serializers
  2. from .models import CarModel, CarFactory, Distributor
  3. class CarModelSerializer(serializers.ModelSerializer):
  4. class Meta:
  5. model = CarModel
  6. fields = ['name', 'price', 'factory_detail', 'distributor_list', 'factory', 'distributors']
  7. extra_kwargs = {
  8. 'factory_detail': {'read_only': True},
  9. 'distributor_list': {'read_only': True},
  10. 'factory': {'write_only': True},
  11. 'distributors': {'write_only': True},
  12. }
  13. class CarFactorySerializer(serializers.ModelSerializer):
  14. class Meta:
  15. model = CarFactory
  16. fields = ['name', 'address', 'phone']
  17. class DistributorSerializer(serializers.ModelSerializer):
  18. class Meta:
  19. model = Distributor
  20. fields = ['name', 'address', 'phone']

permissions.py

  1. from rest_framework.permissions import BasePermission
  2. class AdminPermission(BasePermission):
  3. def has_permission(self, request, view):
  4. if request.user.is_superuser == 1:
  5. return True
  6. else:
  7. self.message = '您没有权限'
  8. return False

page.py

  1. from rest_framework.pagination import CursorPagination
  2. class CommonCursorPagination(CursorPagination):
  3. cursor_query_param = 'cursor' # 查询参数
  4. page_size = 5 # 每页多少条
  5. ordering = 'id' # 排序字段

authenticate.py

  1. from rest_framework.authentication import BaseAuthentication
  2. from rest_framework.exceptions import AuthenticationFailed
  3. import jwt
  4. from .models import UserInfo
  5. from rest_framework_jwt.settings import api_settings
  6. jwt_decode_handler = api_settings.JWT_DECODE_HANDLER
  7. class JsonWebTokenAuthentication(BaseAuthentication):
  8. def authenticate(self, request):
  9. token = request.META.get('HTTP_TOKEN')
  10. if token:
  11. try:
  12. payload = jwt_decode_handler(token)
  13. user = UserInfo.objects.get(pk=payload.get('user_id'))
  14. return user, token
  15. except jwt.ExpiredSignature:
  16. raise AuthenticationFailed('token过期')
  17. except jwt.DecodeError:
  18. raise AuthenticationFailed('token认证失败')
  19. except jwt.InvalidTokenError:
  20. raise AuthenticationFailed('token无效')
  21. except Exception as e:
  22. raise AuthenticationFailed('未知异常')
  23. raise AuthenticationFailed('token没有传,认证失败')

model.py

  1. from django.db import models
  2. from django.db import models
  3. from django.contrib.auth.models import AbstractUser
  4. class UserInfo(AbstractUser):
  5. # 填写AbstractUser表中没有的字段
  6. phone = models.BigIntegerField(null=True)
  7. class CarModel(models.Model):
  8. name = models.CharField(max_length=32)
  9. price = models.CharField(max_length=32)
  10. factory = models.ForeignKey(to='CarFactory', on_delete=models.CASCADE)
  11. distributors = models.ManyToManyField(to='Distributor')
  12. def factory_detail(self):
  13. return {'name': self.factory.name, 'address': self.factory.address, 'phone': self.factory.phone}
  14. def distributor_list(self):
  15. return [{'name': distr.name, 'address': distr.address, 'phone': distr.phone}
  16. for distr in self.distributors.all()]
  17. class CarFactory(models.Model):
  18. name = models.CharField(max_length=32)
  19. address = models.TextField(max_length=32)
  20. phone = models.CharField(max_length=32)
  21. class Distributor(models.Model):
  22. name = models.CharField(max_length=32)
  23. address = models.TextField(max_length=32)
  24. phone = models.CharField(max_length=32)

权限类判断请求方式



注意:

【django drf】 阶段练习的更多相关文章

  1. 解决Django + DRF:403 FORBIDDEN:CSRF令牌丢失或不正确,{"detail":"CSRF Failed: CSRF cookie not set."}

    我有一个Android客户端应用程序尝试使用Django + DRF后端进行身份验证.但是,当我尝试登录时,我收到以下响应: 403: CSRF Failed: CSRF token missing ...

  2. django DRF理解

    django restframework(DRF) 最近的开发过程当中,发现restframework的功能很强大,所以尝试解读了一下源码,写篇博客分享给大家,有错误的地方还请各位多多指出 视图部分 ...

  3. Django DRF 分页

    Django DRF 分页 分页在DRF当中可以一共有三种,可以通过setttings设置,也可也通过自定义设置 PageNumberPagination 使用URL http://127.0.0.1 ...

  4. django drf 基础学习3

    一 简述 这里来谈下一些基本原理 二 汇总 1 restful规范 1 根据method不同做不同的操作          request.method='          get(获取) 返回完整 ...

  5. django drf 基础学习2

    DRF基本程序调用一 models初步编写  1 编写model.py    from django.db import models 导入    class dbinfo(models.Model) ...

  6. django drf 基础学习1

    一 环境配置    python3.5+ django2.0 pymysql二 安装   /usr/bin/python3 -m pip install django   /usr/bin/pytho ...

  7. [django]drf知识点梳理-搜索

    什么是搜索? 譬如http://127.0.0.1:8000/User/?username=maotai-0 可以检索出想要的. 自己实现原始的搜索 重写下get_queryset方法 class U ...

  8. Django + DRF + Elasticsearch 实现搜索功能

    django使用haystack来调用Elasticsearch搜索引擎  如何使用django来调用Elasticsearch实现全文的搜索 Haystack为Django提供了模块化的搜索.它的特 ...

  9. django drf unique_together和UniqueTogetherValidator

    联合唯一可以使用django中的unique_together,和DRF中的UniqueTogetherValidator->https://www.django-rest-framework. ...

  10. django drf JWT

    建议使用djangorestframework-jwt或者djangorestframework_simplejwt,文档为 https://github.com/GetBlimp/django-re ...

随机推荐

  1. com.alibaba.nacos.api.exception.NacosException

    具体异常如下: com.alibaba.nacos.api.exception.NacosException: <html><body><h1>Whitelabel ...

  2. c标签的使用问题

    这是在使用c标签的时候遇到的问题,发现在导入包成功的情况下,jsp页面代码也没有问题.在网页上查了查,发现需要修改tomcat中的 conf/catalina.properties文件. 将tomca ...

  3. 聊一聊 .NET高级调试 内核模式堆泄露

    一:背景 1. 讲故事 前几天有位朋友找到我,说他的机器内存在不断的上涨,但在任务管理器中查不出是哪个进程吃的内存,特别奇怪,截图如下: 在我的分析旅程中都是用户态模式的内存泄漏,像上图中的异常征兆已 ...

  4. CatFly【汇编代码还原】

    CatFly[难度:1] 题目界面 下载附件,发现是dll文件,放到linux中运行一下,运行界面如图所示: 从上图中可以看到两处字符串,上面的字符串不断滚动,下方字符串在次数上不断累加,猜测上方字符 ...

  5. Javascript面向对象的程序设计 —— 自定义类实现继承的6种方法

    许多OO语言都支持两种继承方式: 接口继承:只继承方法签名: 实现继承:继承实际的方法.ECMAScript只支持实现继承,实现继承是继承实际的方法,依靠原型链来实现.1.原型链原型链是实现继承的主要 ...

  6. 若依集成knife4j实现swagger文档增强

    若依集成knife4j实现swagger文档增强 本期全是干货,这里我就当你用的非常熟练了,在ruoyi-admin模块中pom文件里加入以下依赖 注:引用knife4j-spring-boot-st ...

  7. ASR项目实战-交付团队的分工

    对于通常的软件项目,参与角色,比如可以有用户,消费者,产品团队,研发团队(研发团队包括开发和测试),运营团队,运维团队,管理团队. 通常认为,用户,负责购买服务的群体,而消费者,负责使用业务的群体.这 ...

  8. 网安区过年-Log4j2

    Log4j2-2021 漏洞原理 Apache Log4j 2 是Java语言的日志处理套件,使用极为广泛.在其2.0到2.14.1版本中存在一处JNDI注入漏洞,攻击者在可以控制日志内容的情况下,通 ...

  9. Linux系统firewall开启关闭相关命令

    默认情况下,我们的服务器没有开放80或443端口,那么我们需要去开放这些端口, CentOS升级到7之后,发现无法使用iptables控制Linuxs的端口,Centos 7使用firewalld代替 ...

  10. RV1126 DSI 调试

    一.基本信息 开发板:RV1126 linux版本:4.19.111 显示屏:HX070JGI50(7寸) 显示器分别率:1024 * 600 二.MIPI协议 连接示意图(图片来源,正点资料) MI ...