Django之rest_framework(一)

59 篇文章 ¥19.90 ¥99.00
本文介绍了Django REST Framework中的Request和Response对象,包括Request的data和query_params属性,以及Response的初始化、属性和使用。同时讲解了@api_view装饰器和APIView类在视图处理中的应用,以及如何结合Response构建RESTful API的GUI界面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、请求和响应对象介绍

image-20211203171015292

REST framework引入了2个新的对象:Request和Response

1.1、Request

rest_framework.request.Request

该对象扩展了常规的HttpRequest ,增加了对REST框架灵活的请求解析和请求认证的支持

官网:Requests - Django REST framework

主要属性:

  • data

    这个属性类似django的request的POST和FILES属性:

    • django的request.POST:只能获取POST请求的form表单数据

    • rest_framework的request.data:

      • 包括所有已解析的内容,包括文件和非文件输入
      • 支持'POST', 'PUT' 和'PATCH' 方法
      • 支持REST框架的灵活请求解析,而不仅仅支持表单数据。例如,可以传入JSON数据
  • query_params

    就是标准的request.GET属性,不过从命名角度来说,更加合理,因为不是只有GET请求才有GET查询参数

1.2、Response

rest_framework.response.Response

网站:Responses - Django REST framework

该类是Django的 SimpleTemplateResponse 的子类,使用python原始对象进行数据初始化,然后,REST框架使用标准HTTP内容协商来确定它应如何呈现最终的响应内容

1.2.1、初始化

Response(data, status=None, template_name=None, headers=None, content_type=None)

  • data:响应的序列化数据,如果是复杂对象,如模型实例,需要在传入之前序列化为原始数据类型(如dict等)
  • status:响应的状态代码,默认为200
  • template_nameHTMLRenderer选择时使用的模板名称
  • headers:要在响应中使用的HTTP标头的字典
  • content_type:响应的内容类型。通常,这将由内容协商确定的渲染器自动设置,但在某些情况下您可能需要明确指定内容类型
1.2.2、属性
  • data:响应的未呈现的序列化数据

  • status_code:响应状态码,建议使用HTTP_200_OK 这样的常量,而不是 200 这样的数字,常量给每个状态代码提供更明确的标识符

    更详细的见:Status codes - Django REST framework

  • content:渲染后的响应内容,调用此属性前需要调用.render()方法渲染

  • template_name:指定的模板名

  • accepted_renderer:将用于呈现响应的呈现器实例,在视图返回响应之前由APIView@api_view自动设置

  • accepted_media_type:内容协商阶段选择的媒体类型,在视图返回响应之前由APIView@api_view自动设置

  • renderer_context:需要渲染的上下文字典对象,在视图返回响应之前由APIView@api_view自动设置

二、视图API包装器-@api_view

image-20211203174811619

官网:2 - Requests and responses - Django REST framework

框架使用了2个包装 API视图 的包装器:

  • @api_view:用于处理基于函数的视图的装饰器

    rest_framework.decorators.api_view

  • APIView:用于处理基于类的视图

    rest_framework.views.APIView

2.1、代码

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.decorators import api_view
from rest_framework.response import Response


# Create your views here.
@api_view(['GET','POST'])  
# 直观的显示支持的请求方法,不用再写if request.method == 'GET'了,可以配合rest_framework的Response返回json数据
def index(request):
  # return HttpResponse('测试API_View包装器')
  return Response('测试API_View包装器') # 提供了GUI界面,界面里可以操作数据

 

三、RESTFramework的GUI界面

image-20221128130524338

RESTFrame的视图包装器与Response的结合使用提供的GUI界面,可以对数据进行CRUD,但是后台逻辑操作还是由我们自己开发,具体步骤如如:

  • 实现数据的增删改查操作代码

  • 使用视频包装器包装视图

  • 数据的结果返回rest_framework.response.Response

image-20221128141102196

image-20221128141005179

3.1、代码

from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status


from .models import Student
from .serializers import StudentSerializer


'''
数据的增删改查
操作       URL         HTTP方法
添加数据     /students/        POST
修改数据     /student/<int:pk>/    PUT
删除数据     /student/<int:pk>/    DELETE
查询数据     /students/        GET
查询单个数据   /student/<int:pk>/    GET
'''
# Create your views here.
@api_view(['GET','POST'])
def students(request):
  # 根据请求方法进行不同的操作
  if request.method == 'GET':
    # 查询所有数据
    stus = Student.objects.all()
    # 将数据转换为json格式, stus是一个列表,many代表要转换的数据是一个列表
    ser =StudentSerializer(stus,many=True)
    return Response(ser.data)
  elif request.method == 'POST':
    # 添加数据
    # 获取请求体中的数据
    '''
     这个写法不能用
     # data = JSONParser().parse(request)
     # 将数据转换为模型对象
     # ser = StudentSerializer(data=data)
     '''
    ser = StudentSerializer(data=request.data)
    # 验证数据,如果验证通过,则保存数据
    if ser.is_valid():
      # 保存数据
      ser.save()
      return Response(ser.data)
    else:
      # 验证失败,返回错误信息
      return Response(ser.errors,status=400)


@api_view(['GET','PUT','DELETE'])
def student(request,pk):
  # 查询单个数据
  try:
    stu = Student.objects.get(pk=pk)
  except Student.DoesNotExist:
    return Response({'error':'数据不存在'},status=404)
  # 根据请求方法进行不同的操作
  if request.method == 'GET':
    # 将数据转换为json格式
    ser = StudentSerializer(stu)
    return Response(ser.data,status=200)
  elif request.method == 'PUT':
    # 修改数据
    ser = StudentSerializer(stu,data=request.data)
    # 验证数据,如果验证通过,则保存数据
    if ser.is_valid():
      # 保存数据
      ser.save()
      return Response(ser.data,status=status.HTTP_201_CREATED)
    else:
      # 验证失败,返回错误信息
      return Response(ser.errors,status=400)
  elif request.method == 'DELETE':
    # 删除数据
    stu.delete()
    return Response({'msg':'删除成功'},status=204)

### 实现JWT认证 为了实现JSON Web Token (JWT) 认证,在`settings.py`文件中需向Django REST框架的默认认证类列表添加`JSONWebTokenAuthentication`[^1]。 配置如下所示: ```python REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', ), } ``` 安装必要的包对于集成JWT至关重要。通过pip可以轻松完成DRF及其JWT支持库的安装[^4]。 ```bash python -m pip install djangorestframework python -m pip install djangorestframework-jwt ``` 当请求到达时,`request.user`属性会返回由当前请求的身份验证类所确认的相关用户对象[^3]。此过程涉及调用内部方法来处理实际的身份验证逻辑并设置用户实例。 创建视图函数或类时,可以通过装饰器或者基于类的方法限制访问权限,仅允许经过适当授权的用户继续操作。例如: ```python from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView class ExampleView(APIView): permission_classes = [IsAuthenticated] def get(self, request, format=None): content = {'message': 'Hello, you are authenticated!'} return Response(content) ``` 上述代码片段展示了如何定义个简单的API端点,并确保只有已登录且有效令牌存在的客户端才能成功发起GET请求。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟之编程

您的支持将成为我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值