django rest framework 学习笔记2

这篇具有很好参考价值的文章主要介绍了django rest framework 学习笔记2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

注意:该文章部分摘抄之百度,仅当做学习笔记供小白使用,若侵权请联系删除!


显示关联表的数据,本示例会显示所有的关联的数据信息

from rest_framework import serializers
from .models import Student
class StudentModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = "__all__"

读取到的结果器数据关联的为数字,此时需要进行一些操作可以读到正确数据

方法1: source='字段名.关联属性值'

from rest_framework import serializers
from drf_app import models
# 文章的Serializer
class ArticleSerializer(serializers.ModelSerializer):
    category = serializers.CharField(source='category.name')
    class Meta:
         model = models.Article
         fields = ['id','title','summary','content','category']

方法2 : 返回其属性值

from rest_framework import serializers
from . import models


# 文章的Serializer
class ArticleSerializer(serializers.ModelSerializer):
    category = serializers.SerializerMethodField()

    class Meta:
        model = models.Article

        fields = ['id', 'title', 'summary', 'content', 'category']

    def get_category(self, obj):  # obj是表中的一行记录的对象
        return obj.category.name

显示choice类型字段的对应数据

# 方法1
status = serializers.CharField(source='get_status_display')
# 方法2
class Meta:
    def get_category(self,obj):   #obj是表中的一行记录的对象
        return get_status_display()

认证&权限

权限选项:

  • AllowAny           # 容许所有用户
  • IsAuthenticated   #  仅通过认证的用户
  • IsAdminUser      #  仅管理员用户
  • IsAuthenticatedOrReadOnly  #  只有认证的用户可以完全操作,其他可以可读
# 全局认证&权限配置
REST_FRAMEWORK ={
    'DEFAULT_AUTHENTICATION_CLASSES':(
        'rest_framework.authentication.BasicAuthentication', # Basic 认证
        'rest_framework.authentication.SessionAuthentication', # Session 认证
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permission.IsAuthenticated'  #  全局权限管理 登录的用户才可以访问
    ), # 若无此配置,默认所有用户可以访问,rest_framework.permission.AllowAny
}



# view 单个视图认证&权限
from rest_framework.authentication import SessionAuthentication,BasicAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView

class MyView(APIView):
    # 指定认证的方式 # 401 未认证  403 权限被禁止
    authentication_classes = (SessionAuthentication,BasicAuthentication)
    permission_classes = (IsAuthenticated)


# url 文件配置

# DRF自带的登录接口认证
path('api-auth/',include('rest_framework.urls'))  # 登录接口的配置,已封装注销及登录接口

限流: 限制接口的访问频率,减少服务器的压力(反爬虫)

REST_FRAMEWORK ={
    #  限流,全局默认配置
    'DEFAULT_THROTTLE_CLASSES':[
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle',
    ],
    # 设置用户的访问频率,局部用户限制,通过使用UserRateThrottle来限制用户的访问频率
    'DEFAULT_THROTTLE_RATES': {
        # 时间周期  second/minute/hour/day
        'anon':'10/day' ,  # 未认证的用户 10/day
        'user':'1000/day'  # 认证的用户   100/day
    }
}

# 局部配置调用视图view
from rest_framework.throttling import UserRateThrottle

class MyView(APIView):
    # 限流,限制用户的访问频率
    throttle_classes = (UserRateThrottle)

限流类型

  • AnonRateThrottle 
    • 限制所有匿名未认证的用户,使用IP区分
    • 使用DEFAULT_THROTTLE_RATES['anon'] 来设置频率
  • UserRateThrottle
    • 限制认证用户,使用用户ID区分
    • 使用DEFAULT_THROTTLE_RATES['anon'] 来设置频率
  • ScopedRateThrottle
    • 限制用户对于具体视图的访问频率,使用IP或ID区分
    • 视图中使用throttle_scope 制定频率

全局配置

  • DEFAULT_THROTTLE_CLASSES: 设置限流类型
  • DEFAULT_THROTTLE_RATES: 设置限制的频率

过滤:使用列表数据过滤字段信息,可使用django-fitlter扩展支持

pip install  django-filter #  安装过滤器
#  注册app
'django_filters'

 # 指定过滤器
REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS':(
        'django_filters.rest_framework.DjangoFilterBackend'
    )
}
# 方式1 自定义字段过滤
filterset_fields = ('age',)
# 方法2 自定义过滤类
filterset_class = UserInfoFilter

from app.models import UserInfo
from django_filters import rest_framework as filters
class UserInfoFilter(filters.FilterSet):
    """自定义过滤器类"""
    # 自定义字段过滤
    min_age  = filters.NumberFilter(field_name='age',lookup_expr='gte')
    max_age  = filters.NumberFilter(field_name='age',lookup_expr='lte')
    # 关联字段需要 关联字段__属性 实现
    name = filters.CharFilter(field_name='user__name')
    class Meta:
        model = UserInfo
        fields = ['name','age']

接口文档:DRF 自动生成网页版的接口文档,其生成的是继承APIView及其子类的视图

pip install  coreapi # 安装依赖
# setting 配置
REST_FRAMEWORK = {
    # 接口文档配置
    'DEFAULT_SCHEMA_CLASS':'rest_framework.schemas.coreapi.AutoSchema',
}

# url 配置
from django.urls import path,include,re_path
from rest_framework.documentation import include_docs_urls
urlpatterns = [
    re_path(r'^docs/',include_docs_urls(title='接口文档'))
]

排序:DRF提供OrderingFilter可快速实现数据的指定方式排序

# 局部信息配置
serializer_class =xxxserializer
filter_backends = [OrderingFilter] # 指定排序的过滤器
ordering_fields = ('age''id')      # 指定字段

# 指定ordering参数字段对数据集进行排序 xxx/?ordering=age

# 全局配置信息
REST_FRAMEWORK = {
    # 指定过滤器
    'DEFAULT_FILTER_BACKENDS':(
        # 指定django_filters的过滤器过滤
        'django_filters.rest_framework.DjangoFilterBackend',
        # 指定DRF自带的排序过滤器来进行数据排序
        'rest_framework.filters.OrderingFilter'
    ),
}

分页:

# 全局配置
REST_FRAMEWORK = {
    # 分页 全局配置
    'DEFAULT_PAGINATION_CLASS':'rest_frame.pagination.PageNumberPagination',
    'PAGE_SIZE': 10 # 每页数据量
}

# 局部配置

from rest_framework.pagination import PageNumberPagination

class UserInfoPagination(PageNumberPagination):
    page_size = 5 # 每页数据量
    page_query_param =  'page'  # 页面关键字参数,默认 'page'
    page_size_query_param = 'size' # 前端的每页面关键字参数 默认None
    max_page_size = 100 # 每页的数据量的最大值

class MyView(APIView):
    """
    局部配置,可通过pagination_class属性实现不同的分页器
    """
    pagination_class = UserInfoPagination

异常处理:

# setting 配置
REST_FRAMEWORK = {
    # 异常处理配置
    # 'EXCEPTION_HANDLER':'rest_framework.views.exception_handler',
    # 自定义异常的处理函数接口
    'EXCEPTION_HANDLER':'common.exception.my_exception_handler',
}

# 自定义异常处理
from rest_framework.views import exception_handler,Response,status

def custom_exception_handler(exc,context):
    response = exception_handler(exc,context)

    if response is not None:
        response.data['status_code'] = response.status_code
    else:
        data ={'error':'服务器出错了'}
        response  =Response(data,status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    return response

 文件上传:

  • ImageField   # 上传图片
  • FileField       #  上传文件
# model 配置
class ImageModel(models.Model):
    # file = models.FileField()  # 保存文件的字段
    file = models.ImageField() # 用于保存图片文件的字段
    class Meta:
        db_table = 'image'
        verbose_name = '图片'

# serial 序列化
from rest_framework import serializers
from models import UserInfo,ImageModel

class ImageSerializer(serializers.ModelSerializer):
    '图片关联序列化'
    class Meta:
        model = ImageModel
        fields = '__all__'

#setting 配置
# 指定文件上传存放的路径
MEDIA_ROOT = BASE_DIR / 'image'

# 指定文件url的路径
MEDIA_URL = ''


# view视图配置

from .models import models,ImageModel
from rest_framework.viewsets import ModelViewSet,mixins,GenericViewSet


from .serializers import ImageSerializer
class ImageView(mixins.CreateModelMixin,mixins.RetrieveModelMixin,
                mixins.ListModelMixin,GenericViewSet):
    queryset =  ImageModel.objects.all()
    serializer_class = ImageSerializer

文件的上传和获取下载方式自定义优化文章来源地址https://www.toymoban.com/news/detail-828650.html

from .models import models,ImageModel
from rest_framework.viewsets import ModelViewSet,mixins,GenericViewSet
from django.http import FileResponse

from .serializers import ImageSerializer
class ImageView(mixins.CreateModelMixin,mixins.RetrieveModelMixin,
                mixins.ListModelMixin,GenericViewSet):
    queryset =  ImageModel.objects.all()
    serializer_class = ImageSerializer
    # 上传文件优化,限制文件的上传大小
    def create(self, request, *args, **kwargs):
        pic = request.data.get('files')
        size,name,type = pic.size,pic.name,pic.content_type
        if size>1024*30:
            return Response({'error':'图片不可以超过30kb'},status=status.HTTP_400_BAD_REQUEST)
        elif type not in ['image/png','image/jpg']:
            return Response({'error':'你上传的文件格式有问题'},status=status.HTTP_400_BAD_REQUEST)
        else:
            return super().create(request,*args,**kwargs)
    def retrieve(self, request, *args, **kwargs): # 照片获取下载
        pic = self.get_object()
        path = pic.files.path
        return FileResponse(open(path),'rb')

def get_image(request,name):
    path  = MEDIA_ROOT / name
    return FileResponse(open(path,'rb'))


# url 配置
urlpatterns = [
    re_path('image/(.+?)/',views.get_image)
]

到了这里,关于django rest framework 学习笔记2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Django rest framework基本知识

    使用pycharm生成Django项目后,会生成工程目录和app目录 工程目录下5个文件,settings.py是全局配置相关的  urls.py是路有相关的 app相关的目录    models.py 数据库ORM对应的模型类  serializers.py 序列化与反序列化处理    views.py 根据request进行业务逻辑处理,返回response    admin.p

    2024年02月09日
    浏览(43)
  • Django Rest_Framework(三)

    为了方便接下来的学习,我们创建一个新的子应用 opt 注册子应用 总路由,代码: 子路由,代码: 因为接下来的认证组件中需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. admin运营站点的访问地址:http://127.0.0.1:8000/admin 创建管理员以后,访问admin站

    2024年02月14日
    浏览(51)
  • Django Rest_Framework(一)

    在开发Web应用中,有两种应用模式: 前后端不分离[客户端看到的内容和所有界面效果都是由服务端提供出来的。] 前后端分离【把前端的界面效果(html,css,js分离到另一个服务端或另一个目录下,python服务端只需要返回数据即可)】 前端形成一个独立的网站/独立的地址,服

    2024年02月14日
    浏览(40)
  • Django Rest_Framework(二)

    什么时候声明的序列化器需要继承序列化器基类Serializer,什么时候继承模型序列化器类ModelSerializer? 看数据是否从mysql数据库中获取,如果是则使用ModelSerializer,不是则使用Serializer drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作。所以在django原有的dja

    2024年02月14日
    浏览(36)
  • 【后端】Django与Django REST Framework的结合使用

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 随着开发语言及人工智能工具的普及,使得越来越多的人会主动学习使用一些开发语言,本文主要介绍Django与Django REST Framework的结合使用。 创建Django项目通常包括以下步骤: 安装Django : 首先,确保你的

    2024年04月26日
    浏览(36)
  • 【django2.0之Rest_Framework框架一】rest_framework序列器介绍

    Django RestFramework(简称DRF) 提供了序列化器Serialzier的定义,可以帮助我们简化序列化与反序列化的过程,不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。REST framework还提供了认证、权限、限流、过滤、分页、接口文档等功能支持。 github地址: https://

    2024年02月07日
    浏览(44)
  • Django REST framework实现api接口

    drf 是Django REST framework的简称,drf 是基于django的一个api 接口实现框架,REST是接口设计的一种风格。 在django 上运行,首先要安装好django 和数据库驱动,后端接口就是对数据库资源的操作。 restful 接口的规范: 1、创建数据库表,在models.py中 要执行生成表的语句: 2、设置路由

    2024年02月11日
    浏览(43)
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我们使用的是GraphQL, 虽然GraphQL的使用处于上升趋势,但是Rest API还是使用的更广泛一些. 所以还是决定回到传统的rest api framework上来, Django rest framework的官网上给了一个很好用的QuickStart, 我参考Quick Start将前面的Blog的例子用DRF(Django Rest Framework)重新构筑一遍

    2023年04月19日
    浏览(42)
  • Django的Rest framework搭建自定义授权登录

    提示:阅读本章之前,请先阅读目录 之前的文章有写过通过jwt认证的文章,今天这一篇是通过自定义用户认证的; 使用场景:有些API需要用户登录成功之后,才能访问;有些无需登录就能访问 解决方法:创建两张表,一张用户表,一张token表,保存用户登录成功后生产的t

    2024年02月15日
    浏览(38)
  • django rest_framework 部署doc文档

    1.背景    在实际开发过程中,前后端分离的项目,是需要将一份完整的接口文档交付给前端开发人员,这样有利于开发速度和开发质量,以及有可能减少协同时间。 2.内容   本项目是以Python+django+rest_framework作为技术框架,在这套框架中,是有自己支持的api文档,现将实现方

    2024年01月17日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包