ApiView

Django restframework api版本控制组件增加及源码分析

随声附和 提交于 2020-10-22 05:34:18
注意:一定要跟着博主的解说再看代码的中文注释及其下面的一行代码!!! 说到api版本控制,就是我们的前端人员请求的后台接口可能有多个版本,后台的接口地址一般是有两种形式,博主现以这两种形式逐一解释api版本控制组件的源码剖析。 第一种api版本控制的url格式一般是:http://localhost:8000/user/select/?version=v1。第二种是:http://localhost:8000/user/v1/select/。分别对应以下两种 1、我们依然是使用流程来解析源码,首先我们肯定是匹配user下select路由的视图类进入as_view方法 from django.conf.urls import url from . import views app_name = ' [user] ' urlpatterns = [ # 这是get请求参数的 url(r ' select/ ' , views.UserView.as_view(), name= " select " ), # 用户信息查询所有 # 这是urlpath路径的参数 url(r ' ^?P<version>[v1|v2])/select/$ ' , views.UserView.as_view(), name= " select " ), # 用户信息查询所有,与上者只存其一 ] 2

APIView源码分析

僤鯓⒐⒋嵵緔 提交于 2020-10-19 09:20:58
from rest_framework.views import APIView url(r'^books/', views.BookView.as_view()), url.py中使用的as_view()是APIView类的as_view方法,使用的还是django原生的当次请求的request对象。 在运行该 as_view 方法时,内部调用了父类(View)的as_view方法。至此request对象还是原生的request对象。 调用父类的as_view方法,就会返回view方法的内存地址,并加 () 进行调用,返回dispatch方法,注意该dispatch方法不是父类View中的dispatch方法,而是APIView类自己写的dispatch方法。 在该dispatch方法中,通过 request = self.initialize_request(request, *args, **kwargs) 重新封装了request对象,并重新赋值给原生的request对象。 在 initialize_request(request, *args, **kwargs) 方法中,返回了Request类实例化的对象,其中一个参数 authenticators=self.get_authenticators(), 调用了get_authenticators()

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

深入解析当下大热的前后端分离组件django-rest_framework系列三

别来无恙 提交于 2020-05-08 04:20:08
三剑客之认证、权限与频率组件 认证组件 局部视图认证 在app01.service.auth.py: class Authentication(BaseAuthentication): def authenticate(self,request): token=request._request.GET.get( " token " ) token_obj=UserToken.objects.filter(token= token).first() if not token_obj: raise exceptions.AuthenticationFailed( " 验证失败! " ) return (token_obj.user,token_obj) 在views.py: def get_random_str(user): import hashlib,time ctime= str(time.time()) md5=hashlib.md5(bytes(user,encoding= " utf8 " )) md5.update(bytes(ctime,encoding= " utf8 " )) return md5.hexdigest() from app01.service.auth import * from django.http import JsonResponse

深入解析当下大热的前后端分离组件django-rest_framework系列四

匆匆过客 提交于 2020-05-08 03:45:21
查漏补缺系列 解析器 request类 django的request类和rest-framework的request类的源码解析 局部视图 from rest_framework.parsers import JSONParser,FormParser class PublishViewSet(generics.ListCreateAPIView): parser_classes = [FormParser,JSONParser] queryset = Publish.objects.all() serializer_class = PublshSerializers def post(self, request, *args, ** kwargs): print( " request.data " ,request.data) return self.create(request, *args, **kwargs) 全局视图 REST_FRAMEWORK= { " DEFAULT_AUTHENTICATION_CLASSES ":[ " app01.service.auth.Authentication " ,], " DEFAULT_PERMISSION_CLASSES ":[ " app01.service.permissions.SVIPPermission " ,], "

深入解析当下大热的前后端分离组件django-rest_framework系列一

ぃ、小莉子 提交于 2020-05-08 03:27:19
  Nodejs 的逐渐成熟和日趋稳定,使得越来越多的公司开始尝试使用 Nodejs 来练一下手,尝一尝鲜。在传统的web应用开发中,大多数的程序员会将浏览器作为前后端的分界线。将浏览器中为用户进行 页面展示 的部分称之为 前端 ,而将运行在 服务器 ,为前端提供业务逻辑和数据准备的所有代码统称为 后端 。 前后端分离是web应用的一种架构模式。 在开发阶段,前后端工程师约定好数据交互接口,实现并行开发和测试;在运行阶段前后端分离模式需要对web应用进行分离部署,前后端之间使用HTTP或者其他协议进行交互请求。在前后端分离架构中,后端只需要负责按照约定的数据格式向前端提供可调用的 API 服务即可。前后端之间通过HTTP请求进行交互,前端获取到数据后,进行页面的 组装和渲染 ,最终返回给浏览器。 从目前应用软件开发的发展趋势来看,主要有两方面需要注意: 越来越注重用户体验,随着互联网的发展,开始 多终端 化。 大型应用架构模式正在向 云化、微服务化 发展。 我们主要通过前后端分离架构,为我们带来以下四个方面的提升: 为优质产品打造精益团队 通过将开发团队前后端分离化,让前后端工程师只需要专注于前端或后端的开发工作,是的前后端工程师实现自治,培养其独特的技术特性,然后构建出一个全栈式的精益开发团队。 提升开发效率 前后端分离以后,可以实现前后端代码的解耦

轻轻松松学会 DRF Django REST framework

混江龙づ霸主 提交于 2020-05-08 03:22:04
据我了解,目前的IT行业的大部分后端开发,都是需要进行前后端分离的,而前后端分类必不可少的是rest 规范,以下是django rest framework的学习路径: DRF Django REST framework 之 APIView(一) DRF Django REST framework 之 解析器(二) DRF Django REST framework 之 序列化(三) DRF Django REST framework 之 视图组件(四) DRF Django REST framework 之 认证与权限组件(五) DRF Django REST framework 之 频率,响应器与分页器组件(六) DRF Django REST framework 之 路由器与版本控制组件(七) 以上就是drf的大部分内容了,具体详情请参照官网 https://www.django-rest-framework.org/ 来源: oschina 链接: https://my.oschina.net/u/4332571/blog/4093086

Django FBV CBV以及使用django提供的API接口

南楼画角 提交于 2020-05-08 03:02:43
FBV 和 CBV 使用哪一种方式都可以,根据自己的情况进行选择 在一个项目中,如果注册启用了 CsrfViewMiddleware 中间件,则项目中所有的视图函数和视图类在执行过程中都要进行CSRF验证。 此时想使某个视图函数或视图类不进行CSRF验证,则可以使用 csrf_exempt 装饰器装饰不想进行CSRF验证的视图函数 看看FBV的代码: URL的写法: from django.conf.urls import url from api import views urlpatterns = [ # FBV 方式 url(r ' asset ' ,views.asset,name= ' asset ' ), ] views的函数方法: from django.shortcuts import render,HttpResponse,reverse,redirect import json # 由于post需要csrf校验,所以需要排除csrf校验 from django.views.decorators.csrf import csrf_exempt @csrf_exempt def asset(request): if request.method == " POST " : ret = json.loads(request.body.decode( ' utf-8 '

Python之Django rest_Framework(2)

家住魔仙堡 提交于 2020-05-08 00:55:02
实例化: v1 = [ " view.xxx.path.Role " , " view.xxx.path.Group " ,] 可以循环,循环出来的每一个不能实例化 如果把v1循环弄成每一个对象列表,通过rsplit切割,在通过importlib.import_module拿到每一个路径,在通过getattr把它的类名拿过来, 这个类加括号就是实例化想 for item in v1: m = importlib.import_module( ' view.xxx.path ' ) cls = getattr(m, ' Role ' ) cls() from view.xxx.path import Role,Group v2 = [Group,Role] 这个可以循环每一个实例化 for item in v2: # 循环V2的每一个元素加括号,就是实例化 item() rest_Framework的规范: 按顺序:它的method的不同,原来没有考虑,原来是url区分,现在通过method来区分,method的不同提交方式不同,紧接着一般是面向资源的就是把url变成名词,接下就是返回值,以前没有考虑状态码,现在有考虑状态码。(一般有get,post方法,还有put,delete等方法) 一、Django rest_Framework框架 ----为什么用Django rest

django, django_restful 关于Authentication的学习总结

折月煮酒 提交于 2020-04-29 10:15:06
一、关于配置 django: 配置为AUTHENTICATION_BACKENDS restful: 配置为 DEFAULT_AUTHENTICATION_CLASSES REST_FRAMEWORK = { ' DEFAULT_AUTHENTICATION_CLASSES ' : [ ' rest_framework.authentication.BasicAuthentication ' , ' rest_framework.authentication.SessionAuthentication ' , ' rest_framework.authentication.TokenAuthentication ' , ' rest_framework_simplejwt.authentication.JWTAuthentication ' , ], ' DEFAULT_PAGINATION_CLASS ' : ' rest_framework.pagination.PageNumberPagination ' , ' PAGE_SIZE ' : 2 } AUTHENTICATION_BACKENDS = ( # new ' rest_framework.authentication.TokenAuthentication ' , # default ModelBackend '