Django REST framework---请求和响应


【Request对象】

概念:

  平时我们在写Django的视图函数的时候,都会带上一个request参数,这样就能处理平时搭建网站时,浏览器访问网页时发出的常规的HttpRequest。但是现在我们导入了django-rest-framework,它能够对request进行拓展,并且提供更灵活的请求解析。

区别:

  request.POST只能处理前端发起的POST请求,只能处理表单提交的数据。而request.data可以处理任意数据,而不单单是前端提交的表单数据,可用于post, put, patch请求。

实例:

  

  1. request.POST # Only handles form data. Only works for 'POST' method.
  2. request.data # Handles arbitrary data. Works for 'POST', 'PUT' and 'PATCH' methods.

【Response对象】

说明:

  和request对象一样,django-rest-framework也对其进行了很实用的拓展,在我上一篇文章的snippets/views.py中,我们导入了JsonResponse用于返回json格式的响应,在视图函数中是这样的:

举例:

  1. @csrf_exempt
  2. def snippet_list(request):
  3. """
  4. List all code snippets, or create a new snippet.
  5. """
  6. if request.method == 'GET':
  7. snippets = Snippet.objects.all()
  8. serializer = SnippetSerializer(snippets, many=True)
  9. return JsonResponse(serializer.data, safe=False)
  10.  
  11. elif request.method == 'POST':
  12. data = JSONParser().parse(request)
  13. serializer = SnippetSerializer(data=data)
  14. if serializer.is_valid():
  15. serializer.save()
  16. return JsonResponse(serializer.data, status=201)
  17. return JsonResponse(serializer.errors, status=400)

【状态码】

说明:  

  我们知道发送http请求时会返回各种各样的状态吗,但是都是简单的数字,比如200、404等,这些纯数字标识符有时候可能不够明确或者客户端在使用的时候不清楚错误信息甚至是没注意看不到,所以django-rest-framework也对此进行了优化,状态码会是HTTP_400_BAD_REQUEST、HTTP_404_NOT_FOUND这种,极大的提高可读性

【包装API视图】

  

REST框架提供了两个可用于编写API视图的包装器。

  • @api_view装饰器用于处理基于函数的视图
  • APIView类用在基于视图的类上

这些包装提供了一些功能,让我们省去很多工作。比如说确保你在视图中收到Request对象或在你的Response对象中添加上下文,这样就能实现内容通信。

另外装饰器可以在接收到输入错误的request.data时抛出ParseError异常,或者在适当的时候返回405 Method Not Allowed状态码。

紧接着我们再次的重构views.py,当使用装饰器的时候就不需要使用JOSNresponse

  1. @api_view(['GET', 'POST'])
  2. def snippet_list(request):
  3. """
  4. List all code snippets, or create a new snippet.
  5. """
  6. if request.method == 'GET':
  7. snippets = Snippet.objects.all()
  8. serializer = SnippetSerializer(snippets, many=True)
  9. return Response(serializer.data)
  10.  
  11. elif request.method == 'POST':
  12. serializer = SnippetSerializer(data=request.data)
  13. if serializer.is_valid():
  14. serializer.save()
  15. return Response(serializer.data, status=status.HTTP_201_CREATED)
  16. return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
  17.  
  18. @api_view(['GET', 'PUT', 'DELETE'])
  19. def snippet_detail(request, pk):
  20. """
  21. Retrieve, update or delete a code snippet.
  22. """
  23. try:
  24. snippet = Snippet.objects.get(pk=pk)
  25. except Snippet.DoesNotExist:
  26. return Response(status=status.HTTP_404_NOT_FOUND)
  27.  
  28. if request.method == 'GET':
  29. serializer = SnippetSerializer(snippet)
  30. return Response(serializer.data)
  31.  
  32. elif request.method == 'PUT':
  33. serializer = SnippetSerializer(snippet, data=request.data)
  34. if serializer.is_valid():
  35. serializer.save()
  36. return Response(serializer.data)
  37. return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
  38.  
  39. elif request.method == 'DELETE':
  40. snippet.delete()
  41. return Response(status=status.HTTP_204_NO_CONTENT)

以上就是对原有的常规的Django视图函数的改进。

总结一下就是处理request提交过来的数据不需要一定是json格式的数据,返回的响应也不需要一定是json数据,也可以是经过渲染的HTML页面。稍后就会示范使用。

【向URL添加可选格式后缀】

既然上面已经说了返回给客户端的Response可是json或者是HTML等格式的内容,那么用户在使用的时候是如何指定返回哪种格式的内容呢,那就是在URL的最后加上后缀。比如http://127.0.0.1:8000/snippets.json,这样就是用户自己指定了返回json格式的Response,而不是我们在后台指定返回固定的格式。

只需对我们的程序稍加改进就可以了,在两个视图函数添加关键词参数format:

  1. def snippet_list(request, format=None):
  2. -------------------------------------------------------
  3. def snippet_detail(request, pk, format=None):

接下来就是更改我们urls.py文件增加格式后缀的一种的模式

  1. from django.conf.urls import url
  2. from . import views
  3. from rest_framework.urlpatterns import format_suffix_patterns
  4.  
  5. urlpatterns = [
  6. url(r'^snippets/$', views.snippet_list),
  7. url(r'^snippets/(?P<pk>[0-9]+)/$', views.snippet_detail),
  8. ]
  9.  
  10. urlpatterns = format_suffix_patterns(urlpatterns)

对我们上述的Api进行测试

通过启动服务器的方式

还可以在终端下使用http

  1. lee@lee:~/PycharmProjects/Djdemo$ source venv/bin/activate
  2. (venv) lee@lee:~/PycharmProjects/Djdemo$ http http://127.0.0.1:8000/snippets/
  3. HTTP/1.1 200 OK
  4. Allow: OPTIONS, GET, POST
  5. Content-Length: 317
  6. Content-Type: application/json
  7. Date: Mon, 06 Aug 2018 15:29:29 GMT
  8. Server: WSGIServer/0.2 CPython/3.5.2
  9. Vary: Accept, Cookie
  10. X-Frame-Options: SAMEORIGIN
  11.  
  12. [
  13. {
  14. "code": "foo = \"bar\"\n",
  15. "id": 3,
  16. "language": "python",
  17. "linenos": false,
  18. "style": "friendly",
  19. "title": ""
  20. },
  21. {
  22. "code": "print \"hello, world\"\n",
  23. "id": 4,
  24. "language": "python",
  25. "linenos": false,
  26. "style": "friendly",
  27. "title": ""
  28. },
  29. {
  30. "code": "print \"hello, world\"",
  31. "id": 5,
  32. "language": "python",
  33. "linenos": false,
  34. "style": "friendly",
  35. "title": ""
  36. }
  37. ]

我们可以通过使用Accept标头来控制我们得到的响应的格式:

  1. http http://127.0.0.1:8000/snippets/ Accept:application/json # Request JSON
  2. http http://127.0.0.1:8000/snippets/ Accept:text/html # Request HTML

或者通过附加格式后缀:

  1. http http://127.0.0.1:8000/snippets.json # JSON suffix
  2. http http://127.0.0.1:8000/snippets.api # Browsable API suffix

同样,我们可以使用Content-Type标头控制我们发送的请求的格式。

  1. (venv) lee@lee:~/PycharmProjects/Djdemo$ http --form POST http://127.0.0.1:8000/snippets/ code="print 123"
  2. HTTP/1.1 201 Created
  3. Allow: OPTIONS, GET, POST
  4. Content-Length: 93
  5. Content-Type: application/json
  6. Date: Mon, 06 Aug 2018 15:36:11 GMT
  7. Server: WSGIServer/0.2 CPython/3.5.2
  8. Vary: Accept, Cookie
  9. X-Frame-Options: SAMEORIGIN
  10.  
  11. {
  12. "code": "print 123",
  13. "id": 6,
  14. "language": "python",
  15. "linenos": false,
  16. "style": "friendly",
  17. "title": ""
  18. }

--------------

  1. (venv) lee@lee:~/PycharmProjects/Djdemo$ http --json POST http://127.0.0.1:8000/snippets/ code="print 456"
  2. HTTP/1.1 201 Created
  3. Allow: OPTIONS, GET, POST
  4. Content-Length: 93
  5. Content-Type: application/json
  6. Date: Mon, 06 Aug 2018 15:36:50 GMT
  7. Server: WSGIServer/0.2 CPython/3.5.2
  8. Vary: Accept, Cookie
  9. X-Frame-Options: SAMEORIGIN
  10.  
  11. {
  12. "code": "print 456",
  13. "id": 7,
  14. "language": "python",
  15. "linenos": false,
  16. "style": "friendly",
  17. "title": ""
  18. }

如果报错:请参照 https://www.cnblogs.com/youleng/p/9117920.html

--------将继续完善

Django REST framework---请求和响应的更多相关文章

  1. Django整理(五) - 请求与响应 - request对象

    请求对象 一.客户端传参的几种方式 1. 通过URL路径(path)传递,例如:http://127.0.0.1:8000/news/1/2,两个参数:id和page 2. 通过 query stri ...

  2. django rest-framework 2.请求和响应

    一.请求对象 REST 框架引入Request来扩展常规的HttpRequest,并提供了更灵活的请求解析.Request对象的核心功能是request.data属性. 导入方式: from rest ...

  3. Django Rest Framework 请求流程

    用户请求到django,首先经过wsgi,中间件,然后到url路由系统,执行视图类中继承APIView执行as_view方法,在源码中可以看到VPIView继承了django的View类,通过supe ...

  4. Django REST FrameWork中文教程2:请求和响应

    从这一点开始,我们将真正开始覆盖REST框架的核心.我们来介绍几个基本的构建块. 请求对象REST框架引入了Request扩展常规的对象HttpRequest,并提供更灵活的请求解析.Request对 ...

  5. 源码剖析Django REST framework的请求生命周期

    学习Django的时候知道,在Django请求的生命周期中,请求经过WSGI和中间件到达路由,不管是FBV还是CBV都会先执行View视图函数中的dispatch方法 REST framework是基 ...

  6. Django底层剖析之一次请求到响应的整个流程

    As we all know,所有的Web应用,其本质上其实就是一个socket服务端,而用户的浏览器就是一个socket客户端. #!/usr/bin/env python #coding:utf- ...

  7. Django编写RESTful API(二):请求和响应

    欢迎访问我的个人网站:www.comingnext.cn 前言 在上一篇文章,已经实现了访问指定URL就返回了指定的数据,这也体现了RESTful API的一个理念,每一个URL代表着一个资源.当然我 ...

  8. django请求和响应

    本文转载自https://blog.csdn.net/xiaogeldx/article/details/88096341 HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建 ...

  9. Django 学习第九天——请求与响应

    一.HttpRequest 对象: 服务器接收到http协议的请求后,会根据报文创建 HttpRequest 对象视图函数的第一个参数是HttpRequest 对象再django.http 模块中定义 ...

  10. django 请求与响应

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. 最长(大)回文串的查找(字符串中找出最长的回文串)PHP实现

    首先还是先解释一下什么是回文串:就是从左到右或者从右到左读,都是同样的字符串.比如:上海自来水来自海上,bob等等. 那么什么又是找出最长回文串呢? 例如:字符串abcdefedcfggggggfc, ...

  2. iOS SDWebImage知识点

    1.clear 和 clean clear 先把之前的缓存文件夹删除掉,然后新建一个文件夹 clean 先删除过期的文件,然后计算剩余缓存文件的大小 currentSize > maxSize, ...

  3. SonarQube 中文教程 (1)- 简介

    SonarQube是什么 SonarQube 是一个用于代码质量管理的开源平台,用于管理源代码的质量. 通过插件形式,可以支持包括 java, C#, C/C++, PL/SQL, Cobol, Ja ...

  4. ZOJ 2477 Magic Cube(魔方)

    ZOJ 2477 Magic Cube(魔方) Time Limit: 2 Seconds      Memory Limit: 65536 KB This is a very popular gam ...

  5. 【php】单例模式和工厂模式

    单例模式:防止重复实例化,避免大量的new操作,减少消耗系统和内存的资源,使得有且仅有一个实例对象 header("Content-type: text/html; charset=utf- ...

  6. js原生实现抽奖活动(方形非圆盘)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 自身使用的springboot项目中比较全的pom.xml

    在学习的时候常建新的项目,mark下商用的jar <dependency> <groupId>org.mybatis</groupId> <artifactI ...

  8. clojure开发环境配置git, vscode+Calva插件配置

    万事开头难,全是犄角旮旯的细节. 1 安装lein 参见 https://www.cnblogs.com/xuanmanstein/p/10504401.html 2 创建工程 lein 参考http ...

  9. [名词解释 ] transparent

    1.材质,效果透明. 2.思想透明,容易获取(思维简单,单纯) 3.后台静默(of a process or interface) functioning without the user being ...

  10. Activity的介绍

    Activity类是Android应用程序的重要组成部分,activity的启动和组合方式是平台应用程序模型的基本组成部分.Android系统通过调用与其生命周期的特定阶段相对应的特定回调方法来启动A ...