相关文章推荐
慷慨大方的汤圆  ·  2025年安陆市李白文化旅游暑期消费季活动在 ...·  2 周前    · 
至今单身的青蛙  ·  S12段位继承新鲜出炉,排位不掉星大法请查收 ...·  5 月前    · 
风流的奔马  ·  博客來-小李杜·  6 月前    · 
含蓄的鞭炮  ·  南投縣家庭教育網·  7 月前    · 
时尚的萝卜  ·  比海更深剧情介绍_电影_电视猫·  2 年前    · 
小百科  ›  Django REST framework_初学小白Lu的博客
rest django data response
无邪的楼房
2 年前
    • Requirements
    • 下载及配置
    • 请求对象(Request objects)
    • 状态码(Status codes)
    • 包装(wrapping)API视图
      • 1. 基于函数的视图
        • API 策略装饰器
      • 2、基于类的视图
        • 2.1 View与APIView的区别
        • 2.2 实现

        REST framework API的所有全局设定都会放在一个叫REST_FRAMEWORK的配置词典里。首先把下面的内容添加到你的settings.py模块中:

        REST_FRAMEWORK = {
            # Use Django's standard `django.contrib.auth` permissions,
            # or allow read-only access for unauthenticated users.
            'DEFAULT_PERMISSION_CLASSES': [
                'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
        

        请求对象(Request objects)

        1. request.data
          处理任意数据 适用于’POST’,'PUT’和’PATCH’方法。它支持REST framework灵活的请求解析,而不仅仅支持表单数据。 例如,你可以以与处理传入表单数据相同的方式处理传入的JSON数据。
        2. request.query_params
          是request.GET的一个更准确的同义词。
        3. request.user
          通常返回一个 django.contrib.auth.models.User 实例, 尽管该行为取决于所使用的的认证策略。
          如果请求未认证则 request.user 的默认值为django.contrib.auth.models.AnonymousUser的一个实例。
        4. request.auth
          返回任何其他身份验证上下文。
          request.auth 的确切行为取决于所使用的的认证策略,但它通常可以是请求被认证的token的实例。
          如果请求未认证或者没有其他上下文,则 request.auth 的默认值为 None.
        5. request.method
          返回请求的HTTP方法的 大写 字符串表示形式。
          透明地支持基于浏览器的 PUT, PATCH 和 DELETE 表单。
        6. request.content_type
          返回表示HTTP请求正文的媒体类型的字符串对象,如果未提供媒体类型,则返回空字符串。
        7. request.stream
          返回一个表示请求主体内容的流。
        8. request.META
        9. request.session

        状态码(Status codes)

        在你的视图(views)中使用纯数字的HTTP 状态码并不总是那么容易被理解。而且如果错误代码出错,很容易被忽略。REST框架为status模块中的每个状态代码(如HTTP_400_BAD_REQUEST)提供更明确的标识符。

        包装(wrapping)API视图

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

        1. 用于基于函数视图的@api_view装饰器。
        2. 用于基于类视图的APIView类。

        1. 基于函数的视图

        @api_view(http_method_names=['GET'], exclude_from_schema=False)
        此功能的核心是api_view装饰器,它接受视图应该响应的HTTP方法列表的参数。
        默认的情况下,只有GET请求会被接受

        from rest_framework.decorators import api_view
        @api_view()
        def hello_world(request):
            return Response({"message": "Hello, world!"})
        
        @api_view(['GET', 'POST'])
        def hello_world(request):
            if request.method == 'POST':
                return Response({"message": "Got some data!", "data": request.data})
            return Response({"message": "Hello, world!"})
        

        API 策略装饰器

        REST framework提供了一组可以加到视图上的装饰器来重写默认设置。这些装饰器必须放在@api_view的后(下)面。比如,要创建一个使用限制器确保特定用户每天只能调用一次的视图,可以用@throttle_classes装饰器并给它传递一个限制器类的列表。

        from rest_framework.decorators import api_view, throttle_classes
        from rest_framework.throttling import UserRateThrottle
        class OncePerDayUserThrottle(UserRateThrottle):
                rate = '1/day'
        @api_view(['GET'])
        @throttle_classes([OncePerDayUserThrottle])
        def view(request):
            return Response({"message": "Hello for today! See you tomorrow!"})
        

        可用的装饰器有:

        • @renderer_classes(...)
        • @parser_classes(...)
        • @authentication_classes(...)
        • @throttle_classes(...)
        • @permission_classes(...)
          这些装饰器中的每一个都接受一个参数,这个参数必须是类的列表或元组。

        2、基于类的视图

        REST framework提供了一个APIView类,它是Django的View类的子类。

        2.1 View与APIView的区别

        APIView类和一般的View类有以下不同:

        • 被传入到处理方法的请求不会是Django的HttpRequest类的实例,而是REST framework的Request类的实例。
        • 处理方法可以返回REST
          framework的Response,而不是Django的HttpRequest。视图会管理内容协议,给响应设置正确的渲染器。
        • 任何APIException异常都会被捕获,并且传递给合适的响应。
        • 进入的请求将会经过认证,合适的权限和(或)节流检查会在请求被派发到处理方法之前运行。

        2.2 实现

        在URL传递过程,我们只需要调用APIView的as_view()方法,然后URL就会调用业务类对应的HTTP方法,如get,post,put,delete(对应查 增 改 删)方法。
        1.使用django自带的view,获取一个Card表里面的卡号信息:

        # models.py
        class Card(models.Model):
            card_id = models.CharField(max_length=30, verbose_name="卡号", default="")
            card_user = models.CharField(max_length=10, verbose_name="姓名", default="")
            add_time = models.DateField(auto_now=True, verbose_name="添加时间")
            class Meta:
                verbose_name_plural = '银行卡账户'
                verbose_name = "银行卡账户_基本信息"
            def __str__(self):
                return self.card_id
        
        # views.py
        from django.http import JsonResponse
        from rest_framework import serializers
        from django.core import serializers as dj_serializers  # 避免和rest_framework里面的serializers冲突
        from .models import *
        from django.views.generic.base import View
        import json
        class CardListView(View):
            '''基于django的view实现获取card列表'''
            def get(self, request):
                data = {}
                cards = Card.objects.all()
                data['result'] = json.loads(dj_serializers.serialize("json", cards))
                return JsonResponse(data)
        

        2.使用REST framework的APIView
        REST framework的APIView继承了django的View类,先序列化Card类,这里的序列化用rest_framework里面的ModelSerializer。

        from rest_framework.response import Response
        from rest_framework.views import APIView
        from rest_framework import serializers
        from .models import *
        from rest_framework.permissions import IsAuthenticated,AllowAny
        from rest_framework.authentication import TokenAuthentication
        class CardAPISerializer(serializers.ModelSerializer):   # 继承自ModelSerializer类
            '''序列化数据的类,根据model表来获取字段'''
            class Meta:
                model = Card
                fields = '__all__'
        class CardListAPIView(APIView):
            '''REST framework的APIView实现获取card列表 '''
            # authentication_classes = (TokenAuthentication,)  # token认证
            # permission_classes = (IsAuthenticated,)   # IsAuthenticated 仅通过认证的用户
            permission_classes = (AllowAny,)  # 允许所有用户
            def get(self, request, format=None):
                Return a list of all users.
                cards = Card.objects.all()
                serializer = CardAPISerializer(cards, many=True)
                return Response(serializer.data)
        
        # urls.py
        from apiapp import views
        from django.conf.urls import url
        urlpatterns = [
            url(r'^api/v1/cardlist/$', views.CardListAPIView.as_view()),
                                            restful就是一个接口开发的约定俗成的开发规范。不局限于django或者drf,即便我们不使用drf,其实也能实现符合restful规范的api接口。
        同时,drf框架不是restful作者开发出来的!!!
        序列化器-Serializer
        序列化,序列化器会把模型对象转换成字典,将来提供给视图经过response以后变成json字符串
        反序列化,把客户端发送过来的数据,经过视图调用request以后变成python字典,序列化器可以把字典转成模型
        反序列化,完成数据校验功能和操作数据库
        1、restful简介
        在前后端分离的应用模式中,我们通常将后端开发的每个视图都称为一个接口,或者API,前端通过访问接口来对数据进行增删改查。
        restful是一种后端API接口规范
        1.1 http动词
        对于资源的具体操作类型,由HTTP动词表示。
        常用的HTTP动词有下面四个(括号里是对应的SQL命令):
        GET(SELECT):从服务器取出资源(一项或多项)。
        POST(CREATE):在服务器新建一个资源。
        PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
                                            目录一:web开发模式1.1 前后端不分离1.2 前后端分离二:API接口三:接口测试工具:Postman四:RESTful API规范restful十条规范1 数据的安全保障2 接口特征表现3 多数据版本共存4 (重点)数据即是资源,均使用名词(可复数)5 (重点)资源操作由请求方式决定(method)过滤,通过在url上传参的形式传递搜索条件7 响应状态码7.1 正常响应7.2 重定向响应7.3 客户端异常7.4 服务器异常8 错误处理,应返回错误信息,error当做key9 返回结果,针对不同操作,服
                                            我们将创建一个简单的 API,以允许管理员用户查看和编辑系统中的用户和组。官网原文:https://www.django-rest-framework.org/tutorial/quickstart/
        文章目录一、项目设置二、项目布局应如下所示:三、序列化程序四、视图五、网址六、分页七、设置八、测试我们的接口
        一、项目设置
        创建一个名为 的新 Django 项目,然后启动一个名为 的新应用程序。tutorial quickstart
        # Create the project directory
        REST是Representational State Transfer的简称,中文翻译为“表征状态转移”或“表现层状态转化”。
        十条RESTful API设计指南
        1、数据的安全保障
        	url一般采用https协议进行传输,可以提高数据交互过程中安全性
        2、接口特征表现
        	使用api关键字标识接口url,代表该url是完成前后台数据交互的
        3、多数据版本共存
        	当一种数据资源有多个版本,应在url中标识数据版本
        4、数据即资源
        	均使用名词复数表示数据资源
        5、请求方式决定资源的操作方式
                                            DRF中的Request 与 Response
        1. Request
          -REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST framework提供的扩展了HttpRequest类的Request类的对象。
          -REST framework 提供了Parser解析器,在接收到请求后会自动根据Content-Typ...
                                            Rest Framework是前后端分离中用到的一种规范,它与框架本身无关,是一种软件架构风格,全称为Representational State Transfer。  Rest F...
                                                                                            使用Django Rest Framework之前我们要先知道,它是什么,能干什么用?
        Django Rest Framework 是一个强大且灵活的工具包,用以构建Web API
        为什么要使用Rest Framework
                  Django REST Framework可以在Dja...
        
 
推荐文章
慷慨大方的汤圆  ·  2025年安陆市李白文化旅游暑期消费季活动在武汉江汉路盛大启幕
2 周前
至今单身的青蛙  ·  S12段位继承新鲜出炉,排位不掉星大法请查收!-王者荣耀官方网站 ...
5 月前
风流的奔马  ·  博客來-小李杜
6 月前
含蓄的鞭炮  ·  南投縣家庭教育網
7 月前
时尚的萝卜  ·  比海更深剧情介绍_电影_电视猫
2 年前
Link管理   ·   Sov5搜索   ·   小百科
小百科 - 百科知识指南