ApiView

Django Rest Framework(认证、权限、限制访问频率)

倖福魔咒の 提交于 2021-01-19 07:28:19
一、 认证和授权 a. 用户url传入的token认证 from django.conf.urls import url, include from web.viewsimport TestView urlpatterns = [ url(r ' ^test/ ' , TestView.as_view()), ] urls.py # !/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.authentication import BaseAuthentication from rest_framework.permissions import BasePermission from rest_framework.request import Request from rest_framework import exceptions token_list = [ ' sfsfss123kuf3j123 ' , ' asijnfowerkkf9812 ' , ] class TestAuthentication

django Rest Framework----认证/访问权限控制/访问频率限制 执行流程 Authentication/Permissions/Throttling 源码分析

心不动则不痛 提交于 2021-01-19 07:14:31
url: url(r ' books/$ ' ,views.BookView.as_view({ ' get ' : ' list ' , ' post ' : ' create ' })) 为例 当django启动的时候,会调用执行view.BookView.as_view()方法,拿到as_view的返回值view url(r ' books/$ ' ,View.view) 当用户访问books/的时候,会执行View.view(). 执行APIView.dispatch() 当用户访问books/时,django拿到request,然后对request进行了重新封装 并且进行用户认证 url(r ' books/$ ' ,View.view) ---> 执行 self.dispatch() APIView.dispatch() def dispatch(self, request, *args, ** kwargs): ... request = self.initialize_request(request, *args, ** kwargs) self.request = request try : self.initial(request, *args, ** kwargs) .... request = self.initialize_request(request,

Django 学习之Rest Framework 视图相关

烈酒焚心 提交于 2021-01-14 04:26:57
drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作。所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用。 Django REST framwork 提供的视图的主要作用: 控制序列化器的执行(检验、保存、转换数据) 控制数据库查询的执行 调用请求类和响应类 [ 这两个类也是由 drf 帮我们再次扩展了一些功能类。 在接下来的例子中我们将是在上一篇: Django Rest Framework_ 序列化器 _Serializer 继续引用其数据库数据已经模型,为了方便我们学习,所以先创建一个子应用req,并注册配置: python manage.py startapp req 一 .视图 请求与响应 1.Request REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST framework提供的扩展了HttpRequest类的Request类的对象。 REST framework 提供了Parser解析器,在接收到请求后会自动根据Content-Type指明的请求数据类型(如JSON、表单等)将请求数据进行parse解析,解析为类字典[QueryDict]对象保存到Request对象中。 Request

Django Rest Framework(分页、视图、路由、渲染器)

↘锁芯ラ 提交于 2020-12-30 07:54:32
一、分页 试问如果当数据量特别大的时候,你是怎么解决分页的? 方式a、记录当前访问页数的数据id 方式b、最多显示120页等 方式c、只显示上一页,下一页,不让选择页码,对页码进行加密 1、基于limit offset 做分页(如:在url后面加上?offset=0&limit=2,即代表从第0条开始,往后取2条(即1,2)) from rest_framework.pagination import LimitOffsetPagination 1 urlpatterns = [ 2 url(r ' ^admin/ ' , admin.site.urls), 3 url(r ' ^app01/(?P<version>[v1|v2]+)/ ' , include( ' app01.urls ' )) 4 5 ] urls.py 1 urlpatterns = [ 2 url(r ' ^index1/ ' , views.IndexView1.as_view()), 3 url(r ' ^index2/ ' , views.IndexView2.as_view()), 4 url(r ' ^index3/ ' , views.IndexView3.as_view()), 5 url(r ' ^index4/ ' , views.IndexView4.as_view()), 6 url

Django框架(十八)—— drf:序列化组件(serializer)

走远了吗. 提交于 2020-12-25 05:15:47
序列化组件 # 模型层 from django.db import models class Book(models.Model): nid = models.AutoField(primary_key= True) name = models.CharField(max_length=32 ) price = models.DecimalField(max_digits=5, decimal_places=2 ) publish_date = models.DateField() publish = models.ForeignKey(to= ' Publish ' , to_field= ' nid ' , on_delete= models.CASCADE) authors = models.ManyToManyField(to= ' Author ' ) def __str__ (self): return self.name class Author(models.Model): nid = models.AutoField(primary_key= True) name = models.CharField(max_length=32 ) age = models.IntegerField() author_detail = models.OneToOneField

Django-restframework 之权限源码分析

血红的双手。 提交于 2020-12-25 03:40:14
Django-restframework 之权限源码分析 一 前言 上篇博客分析了 restframework 框架的认证组件的执行了流程并自定义了认证类。这篇博客分析 restframework 的权限组件执行流程。入口函数依然是 APIView.initial 。 权限的判断是在用户认证之后进行的,restframework 框架里面的自带的认证实现的功能很简单,如下: 这个方法通常来讲会根据需求定制,该方法执行结束后悔返回用户信息和其他数据,根据需求,在上篇博客我返回了用户对象和 token 值。 本来这些应该在上篇博客结束的,主要是因为今天学习权限组件时又想到有些遗漏所以在这里补充。 二 权限组件执行流程 APIView.perform_authentication() 方法结束,其实是根据 mro 列表找到的。接下来执行 APIView.check_permissions() 方法,restframework 框架自带的权限类相当于没有,因为所有需要进行权限认证的都是返回 True,所以这个也需要根据实际需求来定制。 1. 执行 APIView.check_permissions 其实套路和认证组件很相似 2. 执行APIView.get_permission 对比权限和认证的查找相关类的流程可以发现认证类是在实例化 Request 对象时就把认证类获取当作参数传进去了

Django框架(十八)—— CBV源码分析、restful规范、restframework框架

巧了我就是萌 提交于 2020-12-19 15:05:32
CBV源码分析、restful规范、restframework框架 一、CBV源码分析 1、url层的使用CBV from app01 import views url( r'book/',views.Book.as_view) 2、as_view方法 as_view 是一个类方法,实际上是一个闭包函数(内层函数包含对外层作用域的使用) 请求来了以后,调用 as_view 方法,调用函数中的 view 方法, view 方法是调用了 dispatch 方法 @classonlymethod def as_view (cls, **initkwargs): def view (request, *args, **kwargs): self = cls(**initkwargs) if hasattr(self, 'get') and not hasattr(self, 'head'): self.head = self.get self.request = request self.args = args self.kwargs = kwargs # 如果调用的类Book没有写dispatch方法,就会调用View中的dispatch方法 return self.dispatch(request, *args, **kwargs) view.view_class = cls view

Django组件-ContentType

北慕城南 提交于 2020-11-22 02:00:03
ContentType组件 ContentType是Django的内置的一个应用,可以追踪项目中所有的APP和model的对应关系,并记录在ContentType表中。 当项目做数据迁移后,会有很多django自带的表,其中就有django_content_type表 ContentType组件应用 在model中定义ForeignKey字段,并关联到ContentType表,通常这个字段命名为content-type 在model中定义PositiveIntergerField字段, 用来存储关联表中的主键,通常用object_id 在model中定义GenericForeignKey字段,传入上面两个字段的名字 方便反向查询可以定义GenericRelation字段 postman from django.db import models from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation # Create your models here. class Food(models.Model): """ id title 1 面包 2 牛奶 """

Django ContentType组件

冷暖自知 提交于 2020-11-22 01:47:06
ContentType组件 遇到这一张表要跟多张表进行外键关联的时候~我们Django提供了ContentType组件~ ContentType是Django的内置的一个应用,可以追踪项目中所有的APP和model的对应关系,并记录在ContentType表中。 当我们的项目做数据迁移后,会有很多django自带的表,其中就有django_content_type表,我们可以去看下~~~ ContentType组件应用:   -- 在model中定义ForeignKey字段,并关联到ContentType表,通常这个字段命名为content-type   -- 在model中定义PositiveIntergerField字段, 用来存储关联表中的主键,通常我们用object_id   -- 在model中定义GenericForeignKey字段,传入上面两个字段的名字   -- 方便反向查询可以定义GenericRelation字段 建模: class Appliance(models.Model): """ 家用电器表 id name 1 冰箱 2 电视 3 洗衣机 """ name = models.CharField(max_length=64 ) coupons = GenericRelation(to= " Coupon " ) # 自用于反向查询 不生成字段

DRF throttles 限流源码阅读

狂风中的少年 提交于 2020-10-24 11:04:18
限流 地址 流程分析 入口 实现 1.0 限流在 view 中的入口 dispatch initial check_throttles: 限流器检查 views.py from django.views.generic import View class APIView(View): throttle_classes = api_settings.DEFAULT_THROTTLE_CLASSES # setting.py def get_throttles(self): """ Instantiates and returns the list of throttles that this view uses. """ return [throttle() for throttle in self.throttle_classes] def throttled(self, request, wait): """ If request is throttled, determine what kind of exception to raise. """ raise exceptions.Throttled(wait) def dispatch(self, request, *args, **kwargs): """ `.dispatch()` is pretty much the