Django REST Framework

一文搞懂JWT

依然范特西╮ 提交于 2020-11-03 09:03:08
Django REST framework JWT 一、JWT简介 二、JWT 组成 header payload signature 三.使用 手动生成jwt 前端保存jwt 一、JWT简介 JWT(Json Web Token) 是一个开放标准(RFC 7519),它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法。JWT 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名。它具备两个特点: 简洁(Compact) 可以通过URL, POST 参数或者在 HTTP header 发送,因为数据量小,传输速度快 自包含(Self-contained) 负载中包含了所有用户所需要的信息,避免了多次查询数据库 二、JWT 组成 JWT就一段字符串,由三段信息构成的,将这三段信息文本用 . 链接一起就构成了Jwt字符串。就像这样: 第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature). header jwt的头部承载两部分信息: 声明类型,这里是jwt 声明加密的算法 通常直接使用 HMAC SHA256 完整的头部就像下面这样的JSON: { 'typ': 'JWT', 'alg': 'HS256' } 然后将头部进行base64

rest framework错误笔记——身份验证和权限

南笙酒味 提交于 2020-10-28 15:10:25
按照官网教程(http://www.django-rest-framework.org/tutorial/4-authentication-and-permissions/)走到最后一步验证时,命令窗口执行http POST http://127.0.0.1:8000/snippets/ code="print 123"后 { " detail " : " Authentication credentials were not provided. " } 这条结果是因为#视图类中的写法(1): authentication_classes = ( BasicAuthentication, ) permission_classes = ( IsAuthenticatedOrReadOnly, ) 若根据教程的写法(2) permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly,) 则返回如下结果: { " detail " : " You do not have permission to perform this action. " } 根据版本不同视图类中的代码不同则提示不同,虽然无论哪种结果都代表没有权限,但还是建议用写法(1),因为写法(2)会导致执行http -a admin

12.DRF-节流

99封情书 提交于 2020-10-02 12:18:24
Django rest framework源码分析(3)----节流 添加节流 自定义节流的方法 限制60s内只能访问3次 (1)API文件夹下面新建throttle.py,代码如下: # utils/throttle.py from rest_framework.throttling import BaseThrottle import time VISIT_RECORD = {} #保存访问记录 class VisitThrottle(BaseThrottle): '''60s内只能访问3次''' def __init__(self): self.history = None #初始化访问记录 def allow_request(self,request,view): #获取用户ip (get_ident) remote_addr = self.get_ident(request) ctime = time.time() #如果当前IP不在访问记录里面,就添加到记录 if remote_addr not in VISIT_RECORD: VISIT_RECORD[remote_addr] = [ctime,] #键值对的形式保存 return True #True表示可以访问 #获取当前ip的历史访问记录 history = VISIT_RECORD.get(remote

13.DRF-版本

早过忘川 提交于 2020-08-18 14:46:34
Django rest framework源码分析(4)----版本 版本 新建一个工程Myproject和一个app名为api (1)api/models.py from django.db import models class UserInfo(models.Model): USER_TYPE = ( (1,'普通用户'), (2,'VIP'), (3,'SVIP') ) user_type = models.IntegerField(choices=USER_TYPE) username = models.CharField(max_length=32,unique=True) password = models.CharField(max_length=64) group = models.ForeignKey('UserGroup',on_delete=models.CASCADE) roles = models.ManyToManyField('Role') class UserToken(models.Model): user = models.OneToOneField('UserInfo',on_delete=models.CASCADE) token = models.CharField(max_length=64) class UserGroup

14.DRF-解析器

左心房为你撑大大i 提交于 2020-08-17 04:35:35
Django rest framework(5)----解析器 解析器 (1)api/urls.py # api/urls.py from django.urls import path,re_path from .views import UserView,PaserView urlpatterns = [ re_path('(?P<version>[v1|v2]+)/users/', UserView.as_view(),name = 'api_user'), path('paser/', PaserView.as_view(),), #解析 ] (2)views.py from rest_framework.parsers import JSONParser,FormParser class PaserView(APIView): parser_classes = [JSONParser,FormParser,] #JSONParser:表示只能解析content-type:application/json的头 #FormParser:表示只能解析content-type:application/x-www-form-urlencoded的头 def post(self,request,*args,**kwargs): #获取解析后的结果 print(request.data

Django快速开发实践:Drf框架和xadmin配置指北

心不动则不痛 提交于 2020-08-14 20:55:52
步骤 既然是快速开发,那废话不多说,直接说步骤: 安装Djagno 安装Django Rest Framework 定义models 定义Rest framework的serializers 定义Rest framework的viewsets 配置Rest framework的router 配置管理后台admin 根据需要写template和对应的view 经过这些步骤就能得到一个具备完整的后端接口和后台管理界面的网站了,如果写了template的话还能把前端的工作也做了。 接下来按照上面提到的顺序记录一下我的开发实践。 定义models 好像没啥好说的,Django3多了几个新的特性,可以用class来定义choices,这个比以前的元组定义方便一些,其他的好像没什么了,对了,定义ManyToMany最好设置一个related_name,方便以后在代码里做反向查询。 定义serializers 这个很简单,只要告诉框架你需要序列化model的哪个字段就好了。 官方文档: https://www.django-rest-framework.org/tutorial/1-serialization/ 代码例子如下: from .models import * from rest_framework import serializers class StudentSerializer

Django REST framework (DRF)框架入门之视图【四】

喜夏-厌秋 提交于 2020-08-09 15:56:37
目录 1. 视图 1.2 视图 1.2.1 2个视图基类 1.2.1.1 APIView 1.2.1.2 GenericAPIView[通用视图类] get_serializer(self, args, *kwargs) 1.2.2 5个视图扩展类 1)ListModelMixin 2)CreateModelMixin 3)RetrieveModelMixin 4)UpdateModelMixin 5)DestroyModelMixin 1.2.3 GenericAPIView的视图子类 1)CreateAPIView 3)RetrieveAPIView 4)DestoryAPIView 5)UpdateAPIView 6)RetrieveUpdateAPIView 7)RetrieveUpdateDestoryAPIView 1.3 视图集基类ViewSet 1.3.1 常用视图集父类 1) ViewSet 2)GenericViewSet 3)ModelViewSet 4)ReadOnlyModelViewSet(自行测试吧,就是继承的功能少了) 1.3.2 视图集中定义附加action动作 1.3.3 action属性 2. 路由Routers 2.1 使用方法 2.2 视图集中附加action的声明 2.3 路由router形成URL的方式 1. 视图 Django

15.DRF-分页

为君一笑 提交于 2020-08-06 20:11:31
Django rest framework(6)----分页 第一种分页 PageNumberPagination 基本使用 (1)urls.py urlpatterns = [ re_path('(?P<version>[v1|v2]+)/page1/', Pager1View.as_view(),) #分页1 ] (2)api/utils/serializers/pager.py # api/utils/serializsers/pager.py from rest_framework import serializers from api import models class PagerSerialiser(serializers.ModelSerializer): class Meta: model = models.Role fields = "__all__" (3)views.py from api.utils.serializsers.pager import PagerSerialiser from rest_framework.response import Response from rest_framework.pagination import PageNumberPagination class Pager1View(APIView): def get

05.DRF-Django REST framework 简介

天大地大妈咪最大 提交于 2020-07-28 20:43:38
一、明确REST接口开发的核心任务 分析一下上节的案例,可以发现,在开发REST API接口时,视图中做的最主要有三件事: 将请求的数据(如JSON格式)转换为模型类对象 操作数据库 将模型类对象转换为响应的数据(如JSON格式) 1.1 序列化Serialization 维基百科 中对于序列化的定义: 序列化 (serialization)在计算机科学的资料处理中,是指将数据结构或物件状态转换成可取用格式(例如存成档案,存于缓冲,或经由网络中传送),以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。依照序列化格式重新获取字节的结果时,可以利用它来产生与原始物件相同语义的副本。对于许多物件,像是使用大量参照的复杂物件,这种序列化重建的过程并不容易。面向对象中的物件序列化,并不概括之前原始物件所关联的函式。这种过程也称为物件编组(marshalling)。从一系列字节提取数据结构的反向操作,是反序列化(也称为解编组, deserialization, unmarshalling)。 序列化 在计算机科学中通常有以下定义: 在数据储存与传送的部分是指将一个 对象 存储至一个 储存媒介 ,例如 档案 或是 记亿体缓冲 等,或者透过网络传送资料时进行编码的过程,可以是 字节 或是 XML 等格式。而 字节 的或 XML 编码格式可以还原完全相等的 对象 。这程序被应用在不同

10.DRF-认证

删除回忆录丶 提交于 2020-07-24 05:14:56
Django rest framework源码分析(1)----认证 一、基础 1.1.安装 两种方式: github pip直接安装 pip install djangorestframework 1.2.需要先了解的一些知识 理解下面两个知识点非常重要,django-rest-framework源码中到处都是基于CBV和面向对象的封装 (1)面向对象封装的两大特性 把同一类方法封装到类中 将数据封装到对象中 (2)CBV 基于反射实现根据请求方式不同,执行不同的方法 原理:url-->view方法-->dispatch方法(反射执行其它方法:GET/POST/PUT/DELETE等等) 二、简单实例 2.1.settings 先创建一个project和一个app(我这里命名为API) 首先要在settings的app中添加 INSTALLED_APPS = [ 'rest_framework', ] 2.2.url from django.contrib import admin from django.urls import path from API.views import AuthView urlpatterns = [ path('admin/', admin.site.urls), path('api/v1/auth/',AuthView.as_view()), ]