Django 视图之FBV 与 CBV FBV(function base views) 基于函数的视图,就是在视图里使用函数处理请求 CBV(class base views) 基于类的视图,就是在视图里使用类处理请求...,就是使用了类来处理用户的请求,不同的请求我们可以在类中使用不同方法来处理,这样大大的提高了代码的可读性; 基于类的视图实现主要还是通过父类 View 提供的一个静态方法 as_view() ,as_view...方法是基于类的外部接口, 他返回一个视图函数,调用后请求会传递给 dispatch 方法,dispatch 方法再根据不同请求来处理不同的方法。....as_view()的返回值是view,这样看起来CBV基于类的本质也是基于函数,在满足func2的情况下触发视图函数,源码展示如下: @classonlymethod # 绑定给类的 def...as_view(cls, **initkwargs): """Main entry point for a request-response process."""
return JsonResponse({"code": 1, "message": "用户未登录"}) else: # 如果用户登录,则进入到视图函数中执行...class LoginRequiredJsonMixin(object): @classmethod def as_view(cls, **initkwargs): view...= super(LoginRequiredJsonMixin, cls).as_view(**initkwargs) return login_required_json(view)...""" @classmethod def as_view(cls, **initkwargs): view = super(TransactionAtomicMixin,...cls).as_view(**initkwargs) return transaction.atomic(view)
View.as_view() Python class View: @classonlymethod def as_view(cls, **initkwargs): ""...def view(request, *args, **kwargs): self = cls(**initkwargs) if hasattr(self,...如上面代码所示, 当我们把视图绑定到 url conf 时使用的 as_view 挂载其实返回的是一个函数....这样就太像基于函数的视图了, 当然view_function其实就是函数. as_view 方法是基于类的外部接口, 他返回一个视图函数....调用后, 视图将请求传递给dispatch() 方法,该方法将根据请求的类型(GET, POST, PUT, etc)执行响应的方法(详情参考django/views/generic/base.py,
类视图所有的魔法就在这个函数里了,来看看 Django 究竟是如何神奇地把一个类转为一个函数的。...@classonlymethod def as_view(cls, **initkwargs): """ Main entry point for a request-response...接下来在 as_view 方法中又定义了一个 view 方法,这个方法相信如果你经常写视图函数的话应该非常眼熟,这就是视图函数的标准定义:接收一个 HttpRequest 对象,以及从 url 捕获的非命名组和命名组参数...接着把类中的一些文档字符串和函数名等更新到定义的 view 函数中,然后 as_view 方法返回这个 view 函数。...View 的功能,而这个视图函数 view 则充当了定义在类视图 as_view 方法中的 view 函数的功能。
刚开始写views.py模块的代码,一般都是用def定义的函数视图,不过DRF更推荐使用class定义的类视图,这能让我们的代码更符合DRY(Don't Repeat Yourself)设计原则: ?...我们用它把函数视图改写成类视图,编辑snippets/views.py: from snippets.models import Snippet from snippets.serializers import...()方法返回了一个内部定义的可调用函数: @classonlymethod def as_view(cls, **initkwargs): """Main entry point for a request-response...__name__, key)) # 内部定义了可调用函数 def view(request, *args, **kwargs): self = cls(**initkwargs...东方说 学到这里,已经开始感受到了Django REST framework的强大之处了,我觉得学一个框架,不仅要看如何使用,还需要了解它的设计思路和底层实现,这样才能更好的总结为自己的编程思想,写出更漂亮的代码
是DRF封装的API视图,继承了django.views.generic.base.View: 我们用它把函数视图改写成类视图,编辑snippets/views.py: from snippets.models...snippet.delete() return Response(status=status.HTTP_204_NO_CONTENT) 1234567891011121314151617 类视图的代码跟函数视图是非常类似的...()方法返回了一个内部定义的可调用函数: @classonlymethod def as_view(cls, **initkwargs): “”“Main entry point for a request-response...self = cls(**initkwargs) self.setup(request, *args, **kwargs) if not hasattr(self, 'request')...东方说 学到这里,已经开始感受到了Django REST framework的强大之处了,我觉得学一个框架,不仅要看如何使用,还需要了解它的设计思路和底层实现,这样才能更好的总结为自己的编程思想,写出更漂亮的代码
' ] get请求 post请求 注意:前后端分离csrf已经没有用了,查看一下源码 def as_view(cls, **initkwargs) return csrf_exempt...是闭包函数view的如下源码 @classonlymethod def as_view(cls, **initkwargs): ··· def view(request...def as_view(cls, **initkwargs): # 校验反射的结果 if isinstance(getattr(cls, 'queryset'...,查看源码发现又回到了Django中的View类,所以本质还是和上面一样,用到了闭包返回的view view = super().as_view(**initkwargs) ···...),这里跳转了一下,其实看了父类(View)的源码是和上面Django中写视图类继承的View是一样的,这里的(APIView)的as_view只是进行了简单处理和去掉了csrf中间件校验,真实使用的还是
文章目录 一、类视图使用 二、类视图原理 三、类视图的多继承重写dispatch ---- 一、类视图使用 在Django中也可以使用类来定义一个视图,称为类视图。...: 代码可读性好 类视图相对于函数视图有更高的复用性 , 如果其他地方需要用到某个类视图的某个特定逻辑,直接继承该类视图即可 定义类视图需要继承自Django提供的父类View,可使用from django.views.generic...配置路由时,使用类视图的as_view()方法来添加。...def as_view(cls, **initkwargs): """ Main entry point for a request-response process. """...def view(request, *args, **kwargs): self = cls(**initkwargs) if hasattr(self, 'get')
APIview的请求生命周期源码分析 Django项目启动=>加载settings文件=>加载models、views、urls文件,执行urls文件,调用视图类的as_view()方法。 ?...APIview的as_view()方法继承父类的as_view()方法,并增加了局部禁用csrf中间件的功能 def as_view(cls, **initkwargs): """...).as_view(**initkwargs) view.cls = cls view.initkwargs = initkwargs # Note:...# #局部禁用csrf认证 return csrf_exempt(view) APIview的父类就是Django的视图类view,as_view...()继承父类的as_view功能调用dispatch方法分发请求,下面是父类的as_view() @classonlymethod def as_view(cls, **initkwargs)
Django实战-小程序助手回顾 ?...Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。...一、事务修饰器 视图代码中使用保存点来担任子事务的角色,atomic()上下文管理器。那么,最后所有更改要么被提交,要么被回滚。可以简单使用atomic()装饰器来装饰每一个视图方法。...class TransactionAtomicMixin(object): """提供数据库事务功能""" @classmethod def as_view(cls, **initkwargs...): view = super(TransactionAtomicMixin, cls).as_view(**initkwargs) return transaction.atomic
一、视图层 视图函数(类)简称为视图,就是一个普通的函数(类),它的功能是接收web请求,并返回web响应....的视图层由两种形式构成:FBV基于函数的视图(Function base view)和CBV基于类的视图(Class base view) 1.4.1FBV 我们前面使用的视图函数就是FBV。...__name__, key)) def view(request, *args, **kwargs):#闭包函数 self = cls(**initkwargs...模板传值 1.传函数名:{{ 函数名 }} 给HTML传函数名的时候,模板语法会自动加括号调用该函数,并将函数的返回值当做页面展示的依据,注意模板语法不支持函数传参,也就是说只能给页面传无参函数。...',{'n':n}) # 第二种,使用locals()会将当前所在名称空间中所有的名字全部传递给html页面 2.5模板的继承和导入 在实际开发中,模板文件彼此之间可能会有大量的冗余代码,为此Django
/views/generic/base.py的as_view处理中: @classonlymethod def as_view(cls, **initkwargs): """Main entry...for key in initkwargs: if key in cls.http_method_names: raise TypeError("You tried...__name__, key)) def view(request, *args, **kwargs): self = cls(**initkwargs) if...view.view_initkwargs = initkwargs # take name and docstring from class update_wrapper(view...update_wrapper(view, cls.dispatch, assigned=()) return view 这里的as_view也就是我们在view控制类中经常使用到的,然后他通过一个分发器对请求进行处理
1.群查与单增:ListCreateAPIView 查看源码 # 继承了视图基类 GenericAPIView,工具类 ListModelMixin,CreateModelMixin实现群查和单增 class...其他方法 根据上述源码分析与示例和下面的图示,我们可以很容易知道这些类的功能和用法 ?...方法 GenericViewSet 和 ViewSet 都继承了 ViewSetMixin,as_view 可以配置 请求-函数 映射 比如view = MyViewSet.as_view({'get...': 'list', 'post': 'create'}) class ViewSetMixin: @classonlymethod def as_view(cls, actions=...self = cls(**initkwargs) self.action_map = actions # methods拿到请求方法
在解决一个csrf的问题时,翻了下xadmin BaseAdminView和Django的View部分的代码,关键点少了一条 update_wrapper 使用。导致我的小伙伴调试了半天。...还是看代码 可以对比看下: ## xadmin代码 @classonlymethod def as_view(cls): def view(request, *args, **kwargs):..., updated=()) view.need_site_permission = cls.need_site_permission return view ### django/views.../generic/base.py:class View中的代码 @classonlymethod def as_view(cls, **initkwargs): """Main entry point...for key in initkwargs: if key in cls.http_method_names: raise TypeError("You tried
,会给个空值,但是你也可以给他添加第二个函数表示默认值。...同样的我们的这三个页面的图片和链接都需要反向解析。上面如果我们很多方法都需要验证是否登录!那我们是不是需要写这个login_required函数写无数遍?...): # 静态方法装饰器 @classmethod def as_view(cls,**initkwargs): # 调用父类的as_view方法...view = super(LoginRequiredMixin,cls).as_view(**initkwargs) return login_required(view) 之后我们需要登录之后才能进入的视图...退出功能 在xm_user中views.py中写一个视图类: #导入logout,清除session from django.contrib.auth import logout class LogouView
后面会详细讲解Django每一部分的使用方式和API了 本节内容 内置视图处理对象的定义 内置视图处理对象的使用 源代码分析 1....内置视图处理对象的定义 对于我们视图处理函数,从最原始的HttpResponse()来进行页面数据的输出,到render()函数进行模板页面的操作,已经是可以满足我们的需求了,但是Django赶脚还不够...P\d+)/vote/$", views.vote, name="vote"), ] 这里路由配置的过程中,通过as_view()函数,会自动对目标视图类进行封装,将视图处理类中的...内置类,我们看一下源代码 # 基础视图对象工具类,用于进行视图的渲染操作,包含了as_view()处理函数 class View(object): """ Intentionally simple...@classonlymethod def as_view(cls, **initkwargs): """ Main entry point for a request-response
要是,商品的分类要像某宝或是某东,那样有二级和三级分类,这样又该怎么处理呢?如果每个功能的数据表都单独设计成和用户关联,那功能的不断扩展,会不会影响到整个数据库读写与查询呢?...完成了前一小节的主页,需要对商品详情页单独写一个视图类。会发现,在主页的视图和商品详情页视图中,都会先从缓存中去查询有无数据。...所以最好将验证登录作为一个可继承的 mixin 类,这样在其它需要登录验证的视图中就可以直接继承。...① 验证用户的登录状态 class LoginRequiredMixin(object): """验证用户的登录状态""" @classmethod def as_view(cls..., **initkwargs): view = super(LoginRequiredMixin, cls).as_view(**initkwargs) return login_required
在完成登录到用户提交订单,这一系列的类视图函数,会发现有大量的数据读写操作,像电商这类的项目,更多的是用户在浏览页面的次数比较多,所以在数据查询的场景中都会采用缓存,将用户第一次打开页面,到下一次重新浏览...一、用户地址 用户地址的类视图,包括用户查询地址,也可以让用户创建新的收货地址。 在进入该视图之前,需要先验证用户是否登录,继承 LoginRequiredMinxin 类。...class LoginRequiredMixin(object): """验证用户的登录状态""" @classmethod def as_view(cls, **initkwargs...): view = super(LoginRequiredMixin, cls).as_view(**initkwargs) return login_required(...# 如果地址信息不存在 address = None context = { # "user": user, # django
()) 源码分析 Django项目启动,启动入口为manage.py,先加载settings文件,settings文件通过字符串反射的方法加载配置文件的属性和方法,如果我们在配置文件中将某个app注释掉在其他...: @classonlymethod def as_view(cls, **initkwargs):#类方法,所以可以类名.方法名()调用 """ Main...for key in initkwargs: if key in cls.http_method_names: raise TypeError("...(request, *args, **kwargs): self = cls(**initkwargs) #类实例化的对象...#将类名添加到view的名称空间 view.view_initkwargs = initkwargs #将as_view携带的参数添加到名称空间
模板和类视图 1. 在工程中创建模板目录templates。 然后修改settings.py配置文件中修改TEMPLATES配置项的DIRS值, 如下: ? 2....: 代码可读性好 类视图相对于函数视图有更高的复用性, 如果其他地方需要用到某个类视图的某个特定逻辑,直接继承该类视图即可 4....as_view()方法来添加。...类视图原理 @classonlymethod def as_view(cls, **initkwargs): """ Main entry point for...def view(request, *args, **kwargs): self = cls(**initkwargs) if hasattr(self,
领取专属 10元无门槛券
手把手带您无忧上云