django restframework 初识

简介

从后台开发的角度来说,不借助restframework框架一样可以用django来写接口。但是有了restframework之后,我们用restframework会更加方便,因为这个框架帮我们做了很多事,使用这个框架来开发接口会更加便捷。restframework里面大致实现了以下功能:

  • 权限
  • 认证
  • 访问评率限制
  • 序列化
  • 路由
  • 视图
  • 分页
  • 渲染器
  • 解析器
  • 版本

CBV和FBV

首先django不存在CBV和FBV哪种方式更好的说法,它们的本质都是一样的,写在路由里都是对应一个函数,CBV的as_view其实就是返回一个view函数。

基本流程

APIView的as_view() 方法返回一个不需要csrf验证的view函数,这个view函数调用的其实就是django原生View类中的view函数,原生view函数调用的dispatch,而dispatch被APIview重写了dispatch方法

@classmethod
    def as_view(cls, **initkwargs):
        """
        Store the original class on the view function.

        This allows us to discover information about the view when we do URL
        reverse lookups.  Used for breadcrumb generation.
        """
        if isinstance(getattr(cls, 'queryset', None), models.query.QuerySet):
            def force_evaluation():
                raise RuntimeError(
                    'Do not evaluate the `.queryset` attribute directly, '
                    'as the result will be cached and reused between requests. '
                    'Use `.all()` or call `.get_queryset()` instead.'
                )
            cls.queryset._fetch_all = force_evaluation

        view = super(APIView, cls).as_view(**initkwargs)
        view.cls = cls
        view.initkwargs = initkwargs

        # Note: session based authentication is explicitly CSRF validated,
        # all other authentication is CSRF exempt.
        return csrf_exempt(view)

原生view,在外部是一个classonlymethod, 内部通过cls(**initkwargs)创建实例

        def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            if hasattr(self, 'get') and not hasattr(self, 'head'):
                self.head = self.get
            self.request = request
            self.args = args
            self.kwargs = kwargs
            return self.dispatch(request, *args, **kwargs)

APIView的dispatch

    def dispatch(self, request, *args, **kwargs):
        """
        `.dispatch()` is pretty much the same as Django's regular dispatch,
        but with extra hooks for startup, finalize, and exception handling.
        """
        self.args = args
        self.kwargs = kwargs
        request = self.initialize_request(request, *args, **kwargs)
        self.request = request
        self.headers = self.default_response_headers  # deprecate?

        try:
            self.initial(request, *args, **kwargs)

            # Get the appropriate handler method
            if request.method.lower() in self.http_method_names:
                handler = getattr(self, request.method.lower(),
                                  self.http_method_not_allowed)
            else:
                handler = self.http_method_not_allowed

            response = handler(request, *args, **kwargs)

        except Exception as exc:
            response = self.handle_exception(exc)

        self.response = self.finalize_response(request, response, *args, **kwargs)
        return self.response

restframework的全局配置

APIView有一些默认配置

renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES
    parser_classes = api_settings.DEFAULT_PARSER_CLASSES
    authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES
    throttle_classes = api_settings.DEFAULT_THROTTLE_CLASSES
    permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES
    content_negotiation_class = api_settings.DEFAULT_CONTENT_NEGOTIATION_CLASS
    metadata_class = api_settings.DEFAULT_METADATA_CLASS
    versioning_class = api_settings.DEFAULT_VERSIONING_CLASS

其中api_settings是一个对象 api_settings = APISettings(None, DEFAULTS, IMPORT_STRINGS)
其中DEFAULTS 是配置文件中的一个大字典,这个对象的实例方法如下

    def __init__(self, user_settings=None, defaults=None, import_strings=None):
        if user_settings:
            self._user_settings = self.__check_user_settings(user_settings)
        self.defaults = defaults or DEFAULTS
        self.import_strings = import_strings or IMPORT_STRINGS
        self._cached_attrs = set()

api_settings 对象只有_user_settings, defaults,import_strings 和 _cached_attrs 四个属性,当取不是这4个属性的时候调用__getattr__方法

@property
    def user_settings(self):
        if not hasattr(self, '_user_settings'):
            self._user_settings = getattr(settings, 'REST_FRAMEWORK', {})
        return self._user_settings

    def __getattr__(self, attr):
        if attr not in self.defaults:
            raise AttributeError("Invalid API setting: '%s'" % attr)

        try:
            # Check if present in user settings
            val = self.user_settings[attr]
        except KeyError:
            # Fall back to defaults
            val = self.defaults[attr]

        # Coerce import strings into classes
        if attr in self.import_strings:
            val = perform_import(val, attr)

        # Cache the result
        self._cached_attrs.add(attr)
        setattr(self, attr, val)
        return val

从上面代码来看,是先取我们django settings中的 REST_FRAMEWORK 中的内容,取不到就去DEFAULTS这个大字典去取,所以当我们去做django restframework中的全局配置就是去django settings中配置一个key为REST_FRAMEWORK的大字典。

对request的封装

django restframework中对原生request进行了封装


取GET请求的数据,三种方式:

  1. request._request.GET.get(‘name‘)
  2. request.GET.get(‘name‘)
  3. request.query_params.get(‘name‘)


原文地址:https://www.cnblogs.com/longyunfeigu/p/9361158.html

时间: 2024-10-11 02:30:33

django restframework 初识的相关文章

django restframework serializer 增加自定义字段

在使用django restframework serializer 序列化在django中定义的model时,有时候我们需要额外在serializer中增加一些model中没有的字段.有两种方法实现这个目的. 假设现在有一个Animal模型,其中有name, type, country字段,country为外键.我们在序列化Animal时,需要额外增加外键country的area信息. 方法一: 1.首先,在django的model中定义property class Animal(models

基于Django RESTframework设计Restful API

导语 ? 关于RESTful的问题,在最近的面试中遇到很多,之前有过一定的了解,但没有系统性的总结分析.所以现在结合Django RESTframework来加深对RESTful的理解,同时梳理这过程的一些知识点. 什么是RESTful? ?这个问题是最容易想到的,首先要分析这个问题,网上的其他文章都会讲到有关REST(Representational State Transfer),中文翻译:"表述性状态传递",再白话一点就是对资源的表述性状态传递.刚开始,看到这里头都大了,那我们来

测开大佬告诉你:如何5分钟快速创建restful风格的API接口-使用django restframework框架

一.思考?? 1.创建API接口难吗? 软件测试工程师: 只测过API接口, 从没创建过 应该需要掌握一门后端开发语言和后端开发框架吧!? 脑容量有限,想想就可怕 2.如何创建API接口呢? 使用Django restframework能快速创建符合restful风格的API接口 通过Django restframework框架提供的序列化器.视图集可轻轻松松实现 简单高效,学习成本低 二.搭建项目工程???? 1.创建项目 打开pycharm 创建项目 使用豆瓣源安装Django Django

Django rest-framework框架

rest-framework框架有哪些作用? 一共有十点. 序列化 queryset对象转化为json给客户端返回. 视图 面试题:你写的类都继承过哪些类? 认证 权限 访问频率限制 路由控制 as_view()加参数,不加参数 解析器 分页 渲染器 查看详情. 版本 查看详情. 根据Django请求声明周期,执行顺序: 路由-->视图-->版本-->认证-->权限-->频率-->解析器-->序列化-->分页-->渲染 出现这种问题: 如何解决? se

django restframework解析器和分页

解析器 由来 django请求的原始数据是放到request.body当中,django默认的解析器只负责解析同时满足下面两个条件的数据 请求头 Content-Type: application/x-www-form-urlencoded 数据格式要求name=alex&age=18 只要这两个条件有一个不满足,django默认的解析器就不会把数据解析到request.POST里. 情况一: $.ajax({ url: ... type: POST, # 请求头默认是 application/

02,rest-framework初识

Rest-framework框架的基本组件 快速实例: https://www.django-rest-framework.org/tutorial/quickstart/#quickstart 序列化类 开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式.我们可以通过声明与Django forms非常相似的序列化器(serializers)来实现. 简单实用(基于django原生serializers基于CBV)

Django Restframework.1

官方文档: https://www.django-rest-framework.org/ 中文版文档: https://q1mi.github.io/Django-REST-framework-documentation/ DRF特性:是基于Python打造的实现了RESTApi风格重量级框架 可浏览API 提供丰富认证 支持数据序列化 可以轻量嵌入,仅使用fbv 强大的社区支持 实现:(需要在工程文件的settings.py文件中进行注册) INSTALLED_APPS = [ 'django

Django学习系列之django restframework

曾几何时,Ajax已经统治了Web开发中的客户端,而REST成为web世界中最流行的架构风格(architecture style).所以我们的选择变得很简单:前端ajax访问后端的RESTful API对资源进行操作Django中有一些可选的REST framework,比如django-piston,django-tasypie. 但是我和google(呵呵,不好意思)推荐这个:Django REST framework django-framework就是定义一个url,可以利用这个url

python开发学习-day16(Django框架初识)

s12-20160507-day16 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin