本文将介绍我个人对于DRF框架的学习思维,从回忆式的角度去思考,之前我很多的开发都基于前后端交互的思维去进行,这种方法虽然比较简单,但是不利于我进行相关的维护。而且每次都在我的HTML代码中加上{{}}或者{%%}我都觉得非常的麻烦
于是我就决定自学DRF框架进行前后端分离的开发。进行前后端分离操作时,后端每次我都只给前端传JSON的数据就行,不用我在前端的代码中写其他的数据引入操作。
从我学习的路线去回忆,我首先接触到的是drf框架中的apiview。从代码的角度去看,我先在urls.py文件中创建了一个路径名称为Userinfo的路由,然后在views.py中构建一个class类,在urls.py中将它引进来
from . .views import Userinfo
url(“Userinfo”, views. Userinfo. asview())
接着视图回到views.py中,我们导入restframework.view模块中的APIView,引入response模块中的Response
from restframework. views import APIView
class Userinfo( APIView):
def get( self, request):
return Response(" get方法")
def post( self, request):
return Response(" post方法")
上面我写了一个简单的api,主要用来接受urls的路径来处理这个网页中可能有的get方法和post方法。
这个就能实现简单的get方法和post方法的返回值,但是和传统的方法相比,这个地方可能会多一些相关疑问,比如urls.py中为什么要写asview(),这里我们就要从APIView的源码去看,在我们的APIView中封装了一个方法,这个里面不仅继承了Django中源生的view还自己写了一些方法,构成了整个view,于是我们通过asview就能调用apiview中的asview方法,从而能进入其视图
接着就是视图中的request,这个request和我们传统的Django中的request有着相关的区别,drf中的request不仅继承了原有的request类,还自定义了一些其他的方法,就拿前后端传值来举例,这个request._request就是从drf中引入了Django的request。比如传统的从前端form表单中拿值就是request. POST.get()现在则为request. data.完成数据的获取
例如,我现在写一个drf中的get接口和post接口。
class Userinfo( APIView):
def post(self,request):
data=request. data
return Response(data)
上述就可以实现前段中form中的值传递给我们的后端用户
接着,我学习了drf的认证组件authentic
from restframework.authentication import BaseAuthentication
然后自己创建一个名叫myauthentic的py文件
在views. py中将这个文件导进来
回到myauthentic的py文件
classMyauthentication( Baseauthentication):
def authenticate(self,request):
token=request._request. GET.get(token)
if token:
return Response( token)
else:
return Response(" error")
接下来学习的是我们的序列化组件 serializer
(单词可能拼错,但内容会自动补全)
from restframework import serializer
class myserializer( serializer. serializers):
name = serializer. Charfield( maxlength=32)
age = serializer. Intergent()
token = serializer. charfield( max length=32)
回到views.py文件
将我写的序列化器文件导入到我的views.py文件中,进行整体思路分析,序列化器分为序列化和反序列化功能,序列化是将我的MySQL数据库中的数据转化为JSON格式传递给我的前端,反序列化是将我的前端传递的数据反序列化,存储到我的数据库中,然后将传递的数据以JSON格式重新返回到我的前端
现在写一个例子,我将重新定义我的url和一系列东西,
path("login",views.login.asview())
path(“login/<int:nid>”, views. login2.asview())
接着我们回到 views.py中
class login( APIView):
def get( self, request):
from app01. models import login
data = login. objects. all()
resp = Myserializer( instance= data,Many= True)
return Response( resp. data)
上面的代码就可以返回我们数据库中表名login的所有数据,并把它原有的queryset类型转化成JSON格式的数据传递给我们的前端。
现在,我们将思维变化成前端传递JSON格式的数据传递给我们的后端,整体思路是我们后端先从中拿到我们的值,然后将它进行反序列化,然后将queryset的部分传递给我们的数据库中,最后重新将新增的数据以JSON的格式重新传递回前端表示我传递数据成功,失败则返回error
在class中,我们接着之前的def get()方法
def post(self,request):
from app01.models import login
data= request. data
resp = Myserializer(data=data)
if resp.is_valid():
login.objects.create(**resp.validated_data)
return resp.data
else:
return Response({'static':False,'msg':'error'})
上面中我们定义了一个POST方法,前端传递的数据首先会被我们的后端进行获取,我们将获取的数据命名为data,然后针对data进行了反序列化操作,从而获得了一个命名为resp的序列化器,resp .data就是我们的JSON格式的数据,**resp.validated_data 则是我们经过校验后序列化成功地存储的数据,resp.errors则是我们校验后失败的数据存放位置。针对我们的校验操作,我们从代码内部进行分析,resp .Is_valid()则是都我们resp中的反序列化的数据进行校验,参考的内容则是我们的定义的class MySerilizer类别中的内容,进行maxlenth,类型,是否为空等基础校验,出现错误的,Is_valid()则会给我们返回error,当返回error的时候,return Response(resp.errors)这个就会把我们的错误内容以json的格式返回到我们的前端的detail中
综上就是我对DRF的相关自学内容,学的可能比较少,重点体现了基础的GET,POST方法,针对Delete,put和get方法也是采取上面类似的操作。然后我还学习了APIView的相关逻辑和认证组件的相关方法。还学习了序列化器Serializer的序列化和反序列化方法以及校验的相关方法和内部思路。整体收获还行