当前位置: 首页 > 后端技术 > Python

Django+React全栈开发:view

时间:2023-03-26 16:26:44 Python

基础视图下面来写一个简单的函数视图:.csrfimportcsrf_exemptfromrest_framework.parsersimportJSONParser@csrf_exemptdefarticle_list(request):ifrequest.method=='GET':articles=Article.objects.all()serializer=ArticleSerializer(articles,many=True)返回JsonserialResponse(数据,safe=False)elifrequest.method=='POST':data=JSONParser().parse(request)serializer=ArticleSerializer(data=data)如果serializer.is_valid():serializer.save()returnJsonResponse(serializer.data,status=201)returnJsonResponse(serializer.errors,status=400)上面的视图函数会列出所有存在的Article对象并接受POST请求添加文章。这里使用了装饰器csrf_exempt,因为Django为了防止CSRF攻击,要求POST请求携带CSRFtoken,但是我们这里需要用工具来测试,所以加了装饰器忽略。除了列表视图,让我们添加一个详细视图以通过id访问特定文章:@csrf_exemptdefarticle_detail(request,pk):try:article=Article.objects.get(pk=pk)exceptArticle.DoesNotExist:returnHttpResponse(status=404)ifrequest.method=='GET':serializer=ArticleSerializer(article)returnJsonResponse(serializer.data)elifrequest.method=='PUT':data=JSONParser().parse(request)serializer=ArticleSerializer(article,data=data)ifserializer.is_valid():serializer.save()returnJsonResponse(serializer.data)returnJsonResponse(serializer.errors,status=400)elifrequest.method=='DELETE':文章。delete()returnHttpResponse(status=204)不要忘记修改article/urls.py:urlpatterns=[path('articles/',views.article_list),path('articles//',views.article_detail),]现在你可以使用一些工具来测试我们的API,如果你熟练使用Postman,那么下面的内容可以忽略。所有的Linux发行版基本上都默认安装了curl,但是这里我推荐使用工具httpie,使用pipinstallhttpie来安装该工具。$http://127.0.0.1:8000/articles/HTTP/1.1200OK...[{"body":"React很好","created":"2020-03-21T21:22:55.553124","id":3,"title":"React","updated":"2020-03-21T21:22:55.553182"},......】获取第一篇文章:$httphttp://127.0.0.1:8000/articles/1/HTTP/1.1200OK......{"body":"React很好","created":"2020-03-21T21:10:53.922033","id":1、"title":"React","updated":"2020-03-21T21:10:53.922128"}http命令后跟POST、PUT等,可以进行相应的操作,比如httpPOSThttp://127.0.0.1:8000/articles/title='你好'body='我们一起写代码吧'详情请查看官方文档。或者,如果您更喜欢GUI工具,则可以尝试功能强大的Postman。API视图虽然我们的API现在可以工作了,但是使用原生视图还是有点麻烦。RESTframework为我们提供了一些方便的包:])defarticle_list(request):ifrequest.method=='GET':articles=Article.objects.all()serializer=ArticleSerializer(articles,many=True)返回Response(serializer.data)elifrequest.method=='POST':serializer=ArticleSerializer(data=request.data)ifserializer.is_valid():serializer.save()returnResponse(serializer.data,status=status.HTTP_201_CREATED)returnResponse(serializer.errors,status=status.HTTP_400_BAD_REQUEST)@api_view(['GET','PUT','DELETE'])defarticle_detail(request,pk):try:article=Article.objects.get(pk=pk)除了文章。DoesNotExist:返回响应(状态=status.HTTP_404_NOT_FOUND)如果request.method=='GET':serializer=ArticleSerializer(article)返回Response(serializer.data)elifrequest.method=='PUT':serializer=ArticleSerializer(article,data=request.data)ifserializer.is_valid():serializer.save()returnResponse(serializer.data)returnResponse(serializer.errors,status=status.HTTP_400_BAD_REQUEST)elifrequest.method=='DELETE':文章。delete()returnResponse(status=status.HTTP_204_NO_CONTENT)现在代码量比之前减少了,RESTframework为我们封装了Request和Response类,详情请访问官网你一定想到了智能类视图。RESTframework也为我们提供了类似Django的类视图:ArticleList(APIView):defget(self,request,format=None):articles=Article.objects.all()序列化器=ArticleSerializer(articles,many=True)returnResponse(serializer.data)defpost(self,request,format=None):serializer=ArticleSerializer(data=request.data)如果serializer.is_valid():serializer.save()returnResponse(serializer.data,status=status.HTTP_201_CREATED)returnResponse(serializer.errors,status=status.HTTP_400_BAD_REQUEST)详细视图:classArticleDetail(APIView):defget_object(self,pk):try:returnArticle.objects.get(pk=pk)exceptArticle.DoesNotExist:提高Http404defget(self,request,pk,format=None):snippet=self.get_object(pk)serializer=ArticleSerializer(snippet)returnResponse(serializer.data)defput(self,request,pk,format=None):snippet=self.get_object(pk)serializer=ArticleSerializer(snippet,data=request.data)如果serializer.is_valid():serializer.save()returnResponse(serializer.data)returnResponse(serializer.errors,status=status.HTTP_400_BAD_REQUEST)defdelete(self,request,pk,format=None):snippet=self.get_object(pk)snippet.delete()returnResponse(status=status.HTTP_204_NO_CONTENT)通过实现get,put,等等,实现对不同HTTP请求的处理对于类视图,我们需要修改article/urls.py:urlpatterns=[path('articles/',views.ArticleList.as_view()),path('articles//',views.ArticleDetail.as_view()),]现在用工具测试,API又正常了。viewsetsREST框架为我们提供了更强大的视图集合,包括一些常用的视图,直接上代码:objects.all()serializer_class=ArticleSerializer我们写的ArticleViewSet类只有两行代码,但是涵盖了前面所有的功能。viewsets可以配合官方路由系统router使用,修改article/urls.py:fromdjango.urlsimportpath,includefromrest_framework.routersimportDefaultRouterfromarticleimportviewsrouter=DefaultRouter()router.register(r'articles',views.ArticleViewSet)urlpatterns=[path('',include(router.urls)),]注意:确保你的项目urls.py包含文章的url。#项目级urlsurlpatterns=[path('',include('article.urls')),]我们要做前后端分离开发,所以这里其实不用写模板,但是为了调试方便,REST框架为我提供了一套默认模板,所以如果你打开浏览器访问默认地址127.0.0.1:8000,就可以看到页面。此外,强大的路由系统还贴心地为我们提供了首页。这里只是简单介绍几种写视图的方法。如果你想了解更多,你应该阅读官方文档。Viewsets很强大,但是当你需要高度定制化的时候,就缺少了一些灵活性。稍后您将根据需要选择使用它们。简单的功能总是直接使用viewsets,需要自定义内容的时候再详细介绍。扫描二维码关注龚自政宅家日常,第一时间查看最新推送: