首页 > 其他分享 >django rest_framework面经

django rest_framework面经

时间:2024-10-08 11:02:18浏览次数:8  
标签:DEFAULT 面经 rest 认证 framework 权限 drf

1、什么是drf组件

drf的全称是Django RESTful Framework;
它是一个基于django开发的组件,本质是一个django的app;
drf可以帮我们快速开发出一个遵循restful规范的程序。

2、drf组件提供的功能

1.免除csrf认证
2.视图(三种:(1)APIView,(2)ListAPIview,(3)GenericViewSet)
3.版本处理
4.认证
5.权限
6.节流(频率限制)
7.解析器
8.筛选器
9.分页
10.序列化和数据校验:可以对QuerySet进行序列化,也可以对用户提交的数据进行校验——展示特殊的数据
     depth
     source:无需加括号,在源码内部会去判断是否可执行,如果可执行自动加括号。【多对一、一对一/choice】
     SerializerMethodField定义钩子方法【多对多】
11.渲染器:可以帮我们把json数据渲染到drf自己的页面上。

3、drf的主要视图有哪些?

主要视图有3种:APIView,ListAPIview,GenericViewSet。

第一种:APIView
    第一种遵循了CBV的模式,里面的功能比较多但是需要自己写的代码也有很多
    提供了免除csrf认证,版本处理、认证、权限、节流、解析器、筛选器、分页、序列化、渲染器
 ​
 ​
 第二种:ListAPIView,RetrieveAPIView,CreateAPIView,UpdateAPIView,DestroyAPIView
    第二种则在第一种的基础上,封装了许多我们需要自己的写的代码,许多功能的实现只需要给专属的变量名赋值就可以实现该功能
 ​
 ​
 第三种:GenericViewSet,ListModelMixin,RetrieveModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin
    第三种则重构了APIView中的as_view()方法,结合请求方法和不同Mixin类的方法名从而进行执行不同的功能。
    与前面两种最主要的区别是url路由中as_view()方法中需要传值。
    目前使用的主要目的是把第二种的bug(查询全部数据的功能和查询单个数据的功能无法在一个类中实现)实现在一个类中!

4、版本处理

DRF提供了几种版本控制类,如URLPathVersioning、NamespaceVersioning和AcceptHeaderVersioning等。开发人员可以根据自己的需求选择合适的版本控制类。

在Django REST Framework中使用版本控制,需要在settings.py文件中配置版本控制类。可以使用DEFAULT_VERSIONING_CLASS设置来指定版本控制类的名称.

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.NamespaceVersioning',  # 版本验证
    'DEFAULT_VERSION': 'v2',  # 默认版本
    'ALLOWED_VERSIONS': ['v1', 'v2'],  # 有效版本
}


# 接着在注册的 API 接口前带上版本号:
# urls.py
from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from .views import UserViewSet

urlpatterns = [
    path('api/v1/users/', UserViewSet.as_view({'get': 'list'}), name='user-list'),
]

urlpatterns = format_suffix_patterns(urlpatterns)

5、drf认证

REST framework 提供了4种认证方式:BasicAuthentication、SessionAuthentication、TokenAuthentication、RemoteUserAuthentication等。
(DRF的认证是在定义有权限类(permission_classes)的视图下才有作用)

(1)BasicAuthentication 该认证方案使用 HTTP Basic Authentication,并根据用户的用户名和密码进行签名。

(2)SessionAuthentication 此认证方案使用 Django 的默认 session 后端进行认证。

(3)TokenAuthentication 此认证方案使用简单的基于令牌的 HTTP 认证方案。

(4)RemoteUserAuthentication 这种身份验证方案允许您将身份验证委托给您的 Web 服务器,该服务器设置 REMOTE_USER 环境变量。

# setting.py

INSTALLED_APPS = (
    ...
    'rest_framework.authtoken'  # 迁移数据库时(python manage.py migrate)会生成一个token表用于存储token信息
)


# TokenAuthentication身份验证
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',  # drf的身份认证类
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',  # def的权限验证
    )
}

6、drf权限

drf 提供了5种权限:AllowAny、IsAuthenticated、IsAdminUser、IsAuthenticatedOrReadOnly、DjangoModelPermissions

(1)AllowAny权限类将允许不受限制的访问,而不管该请求是否已通过身份验证或未经身份验证。

(2)IsAuthenticated 权限类将拒绝任何未经身份验证的用户的权限,并允许其他权限。 如果你希望你的API仅供注册用户访问,则此权限适用。

(3)IsAdminUser 除非user.is_staff为True,否则IsAdminUser权限类将拒绝任何用户的权限,在这种情况下将允许权限。

(4)IsAuthenticatedOrReadOnly 将允许经过身份验证的用户执行任何请求。只有当请求方法是“安全”方法(GET, HEAD 或 OPTIONS)之一时,才允许未经授权的用户请求。

(5)DjangoModelPermissions 此权限类与Django的标准django.contrib.authmodel权限相关联。此权限只能应用于具有.queryset属性集的视图。只有在用户通过身份验证并分配了相关模型权限的情况下,才会被授予权限。

# setting.py 添加配置
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',  # drf的身份认证类
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',  # def的权限验证
    )
}

7、drf节流处理

匿名用户通过ip地址来控制访问频率,已登录用户通过id来控制
 首先要设置配置文件:
 # 也可以设置全局,
     "DEFAULT_THROTTLE_CLASSES":["rest_framework.throttling.AnonRateThrottle",]
 # 设置访问频率——一分钟10次
     "DEFAULT_THROTTLE_RATES": {
             "anon":"10/m"
         }
 - 实现原理
     把所有登录记录时间放在一个列表中,当用户请求网页的时候,用现在的时间减去约束的时间间隔,然后把小于这个时间记录排除,再计算出时间间隙的记录条数,
     如果其中的条数小于规定的条数则可以访问并且把当前时间添加进列表中,如果大于或等于则不让其访问。
 - 具体流程
     当用户请求网页的时候,后台允许该界面的url中的as_views(),运行源码的APIView中的dispatch方法,运行initial方法,里面的check_throttles方法,
     循环运行节流类中的allow_request方法,但是AnonRateThrottle等类中没有,去执行SimpleRateThrottle类中的allow_request方法,里面就是实现原理中的代码,
     如果可以访问返回True,如果不让访问则返回False,之后返回check_throttles,如果是False则运行SimpleRateThrottle类中的wait方法得到需要等待的时间在页面上显示!

8、序列化器

REST framework提供了两种序列化器:Serializer类和ModelSerializer类。

(1)Serializer 是对对象的序列化和反序列化

class Book(models.Model):
    id = models.IntegerField(primary_key=True)
    title = models.CharField(max_length=255)
    desc = models.CharField(max_length=255)
    is_deleted = models.IntegerField(choices=[(1, "删除"), (0, "未删除")])
    author = models.CharField(max_length=255)

(2)ModelSerializer 是将model中定义的字段直接序列化处理

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = ['id', 'account_name', 'users', 'created']

ModelSerializer 会自动生成model字段对应的Field不用我们定义。

标签:DEFAULT,面经,rest,认证,framework,权限,drf
From: https://www.cnblogs.com/lanjianhua/p/18451243

相关文章

  • TEN Framework 入坑记
    TL;DRTENFramework最初叫Astra,后改为TEN,即TransformativeExtensionsNetwork。我第一次见到TEN(那时还叫Astra)是在今年的6月份的极客公园AGIPlayground大会RTEOpenDay的活动上。当时展区现场人声嘈杂,但对话效果已经很不错。当时我们在展示用XSwitch支持多模态......
  • c++面经系列0:开篇-c++岗位面试都会问些什么?
    本文是C++岗位面试经验分享系列的开篇,敬请持续关注。在C++岗位面试中,通常首先进行技术面试,若通过则会进行HR面试。HR面试的内容先暂且略过,未来我们会有机会深入探讨,今天我们主要聚焦于技术面试的环节。技术面试通常由同岗位的同事或技术团队的领导担任面试官。在开场交流时,可以......
  • pbootcms模板报错提示PHP Warning: Unknown: open_basedir restriction
    当PbootCMS模板出现报错提示 PHPWarning:Unknown:open_basedirrestrictionineffect.File 时,通常是因为PHP的 open_basedir 限制设置不当。以下是解决该问题的简要步骤:解决步骤检查PHP配置文件(php.ini):确认 open_basedir 设置是否正确。修改 open_b......
  • Restore .bacpac file to DEV VM D365 FO
    Restore.bacpacfiletoDEVVMD365FO Restore.bacpacfiletoDevelopmentVMSteps: 1.       TakeBackupofAxDBdatabasefromDevelopmentVM 2.       OpenCommandPrompt(RunasAdministrator)GoToPath(VersionFoldermightbedif......
  • Android 11.0 framework默认沉浸式导航栏功能实现
    1.前言在11.0的系统rom定制化开发中,在实现导航栏的某些定制化开发中,在某些产品需要实现沉浸式导航栏,就是需要app能全屏显示同样也能显示导航栏,接下来就来分析下相关的功能实现如图:2.framework默认沉浸式导航栏功能实现的核心类frameworks\base\core\java\android\a......
  • Pyramid Interests PerfectNumber ArmstrongNumbers
    Homework2Note:Submityourwork(uploadthe.javasourcecodefilesONLY,notthecompiled.classfiles!)throughthe“Homework2”linkonBrightspace.Youmaysubmitanunlimitednumberoftimes;wewillonlygradethelast/latestsubmissionattempt,but......
  • Paper Reading: Deep balanced cascade forest: An novel fault diagnosis method for
    目录研究动机文章贡献本文方法混合采样新型平衡森林DBCF整体流程实验结果数据集和实验设置对比故障诊断方法对比基于决策树的方法对比不平衡分类方法模型效率的比较优点和创新点PaperReading是从个人角度进行的一些总结分享,受到个人关注点的侧重和实力所限,可能有理解不到位的......
  • docker安装openresty
     一、创建网络dockernetworkcreate-dbridgemy_network 二、拉取镜像dockerpullopenresty/openresty 三、运行临时容器dockerrun-itd--nameopenresty-p80:80--restart=always--netmy_networkopenresty/openresty 四、宿主机创建相应目录mkd......
  • 恋爱虽易,相处不易:当EntityFramework爱上AutoMapper
    恋爱虽易,相处不易:当EntityFramework爱上AutoMapper  剧情开始为何相爱?相处的问题?女人的伟大?剧情收尾?有时候相识即是一种缘分,相爱也不需要太多的理由,一个眼神足矣,当EntityFramework遇上AutoMapper,就是如此,恋爱虽易,相处不易。在DDD(领域驱动设计)中,使用AutoMap......
  • 问题记录:EntityFramework 一对一关系映射
    问题记录:EntityFramework一对一关系映射 EntityFramework一对一关系映射有很多种,比如主键作为关联,配置比较简单,示例代码:publicclassTeacher{publicintId{get;set;}publicstringName{get;set;}publicvirtualStudentStudent{get;set;}......