当前位置: 首页 > news >正文

中央农村工作会议指出/网站优化排名推荐

中央农村工作会议指出,网站优化排名推荐,网络公司网站案例,苏州优化网站建设2019独角兽企业重金招聘Python工程师标准>>> 1 类视图引入 以函数的方式定义的视图称为函数视图,函数视图便于理解。但是遇到一个视图对应的路径提供了多种不同HTTP请求方式的支持时,便需要在一个函数中编写不同的业务逻辑,代码可…

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1 类视图引入

以函数的方式定义的视图称为函数视图,函数视图便于理解。但是遇到一个视图对应的路径提供了多种不同HTTP请求方式的支持时,便需要在一个函数中编写不同的业务逻辑,代码可读性与复用性都不佳。

 def register(request):"""处理注册"""# 获取请求方法,判断是GET/POST请求if request.method == 'GET':# 处理GET请求,返回注册页面return render(request, 'register.html')else:# 处理POST请求,实现注册逻辑return HttpResponse('这里实现注册逻辑')

在Django中也可以使用类来定义一个视图,称为类视图

使用类视图可以将视图对应的不同请求方式以类中的不同方法来区别定义。如下所示

from django.views.generic import Viewclass RegisterView(View):"""类视图:处理注册"""def get(self, request):"""处理GET请求,返回注册页面"""return render(request, 'register.html')def post(self, request):"""处理POST请求,实现注册逻辑"""return HttpResponse('这里实现注册逻辑')

类视图的好处:

  • 代码可读性好
  • 类视图相对于函数视图有更高的复用性, 如果其他地方需要用到某个类视图的某个特定逻辑,直接继承该类视图即可

2 类视图使用

定义类视图需要继承自Django提供的父类View,可使用from django.views.generic import View或者from django.views.generic.base import View 导入,定义方式如上所示。

配置路由时,使用类视图的as_view()方法来添加

urlpatterns = [# 视图函数:注册# url(r'^register/$', views.register, name='register'),# 类视图:注册url(r'^register/$', views.RegisterView.as_view(), name='register'),
]

3 类视图原理

    @classonlymethoddef as_view(cls, **initkwargs):"""Main entry point for a request-response process."""...省略代码...def view(request, *args, **kwargs):self = cls(**initkwargs)if hasattr(self, 'get') and not hasattr(self, 'head'):self.head = self.getself.request = requestself.args = argsself.kwargs = kwargs# 调用dispatch方法,按照不同请求方式调用不同请求方法return self.dispatch(request, *args, **kwargs)...省略代码...# 返回真正的函数视图return viewdef dispatch(self, request, *args, **kwargs):# Try to dispatch to the right method; if a method doesn't exist,# defer to the error handler. Also defer to the error handler if the# request method isn't on the approved list.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_allowedreturn handler(request, *args, **kwargs)

4 类视图使用装饰器

为类视图添加装饰器,可以使用两种方法。

为了理解方便,我们先来定义一个为函数视图准备的装饰器(在设计装饰器时基本都以函数视图作为考虑的被装饰对象),及一个要被装饰的类视图。

def my_decorator(func):def wrapper(request, *args, **kwargs):print('自定义装饰器被调用了')print('请求路径%s' % request.path)return func(request, *args, **kwargs)return wrapperclass DemoView(View):def get(self, request):print('get方法')return HttpResponse('ok')def post(self, request):print('post方法')return HttpResponse('ok')

4.1 在URL配置中装饰

urlpatterns = [url(r'^demo/$', my_decorate(DemoView.as_view()))
]

此种方式最简单,但因装饰行为被放置到了url配置中,单看视图的时候无法知道此视图还被添加了装饰器,不利于代码的完整性,不建议使用。

此种方式会为类视图中的所有请求方法都加上装饰器行为(因为是在视图入口处,分发请求方式前)。

4.2 在类视图中装饰

在类视图中使用为函数视图准备的装饰器时,不能直接添加装饰器,需要使用method_decorator将其转换为适用于类视图方法的装饰器。

method_decorator装饰器使用name参数指明被装饰的方法

# 为全部请求方法添加装饰器
@method_decorator(my_decorator, name='dispatch')
class DemoView(View):def get(self, request):print('get方法')return HttpResponse('ok')def post(self, request):print('post方法')return HttpResponse('ok')# 为特定请求方法添加装饰器
@method_decorator(my_decorator, name='get')
class DemoView(View):def get(self, request):print('get方法')return HttpResponse('ok')def post(self, request):print('post方法')return HttpResponse('ok')

如果需要为类视图的多个方法添加装饰器,但又不是所有的方法(为所有方法添加装饰器参考上面例子),可以直接在需要添加装饰器的方法上使用method_decorator,如下所示

from django.utils.decorators import method_decorator# 为特定请求方法添加装饰器
class DemoView(View):@method_decorator(my_decorator)  # 为get方法添加了装饰器def get(self, request):print('get方法')return HttpResponse('ok')@method_decorator(my_decorator)  # 为post方法添加了装饰器def post(self, request):print('post方法')return HttpResponse('ok')def put(self, request):  # 没有为put方法添加装饰器print('put方法')return HttpResponse('ok')

5 类视图Mixin扩展类

使用面向对象多继承的特性,可以通过定义父类(作为扩展类),在父类中定义想要向类视图补充的方法,类视图继承这些扩展父类,便可实现代码复用。

定义的扩展父类名称通常以Mixin结尾。

举例如下:

class ListModelMixin(object):"""list扩展类"""def list(self, request, *args, **kwargs):...class CreateModelMixin(object):"""create扩展类"""def create(self, request, *args, **kwargs):...class BooksView(CreateModelMixin, ListModelMixin, View):"""同时继承两个扩展类,复用list和create方法"""def get(self, request):self.list(request)...def post(self, request):self.create(request)...class SaveOrderView(CreateModelMixin, View):"""继承CreateModelMixin扩展类,复用create方法"""def post(self, request):self.create(request)...

转载于:https://my.oschina.net/u/4142063/blog/3056600

http://www.lbrq.cn/news/1545661.html

相关文章:

  • 企业网站会涉及到的版权问题/视频互联网推广选择隐迅推
  • 一家做特卖的网站叫什么/seo网站推广什么意思
  • 微盟商户助手app下载/南昌seo快速排名
  • 东莞企业网站建设营销/厦门网站到首页排名
  • 怎么做轴承网站/百度怎么精准搜关键词
  • 音乐网站如何建设的/seo优化服务是什么
  • 好的网站建设公司哪家好/网络推广app是干什么的
  • 苏州h5建站/网店培训
  • 网件路由器wifi初始密码/免费seo排名优化
  • 网站建设教程参加苏州久远网络/网站站点查询
  • 铜川市网站建设/seo外包靠谱
  • 网络营销推广的应用场景/百度网站的优化方案
  • wordpress主页分栏/廊坊百度快照优化哪家服务好
  • 深圳网站设计招聘信息/代运营公司怎么找客户
  • 大连微网站建设/100种宣传方式
  • 做便民网站都需要哪些模块/免费推客推广平台
  • 时时彩网站开发代理代码/新浪舆情通官网
  • 制作一个网站步骤排版/seo优化排名易下拉用法
  • 短视频营销是什么意思/深圳百度seo整站
  • 网站上传文件/企业网站管理系统
  • 镜像网站怎么做排名/最有效的线上推广方式
  • wordpress软件下载站/咨询公司
  • java做企业网站/直通车关键词怎么优化
  • 运动猿app 网站开发/网络整合营销
  • 如何做一个静态网站/用模板快速建站
  • 温州敎玩具网站建设/百度官方客户端
  • 做网站没有公网/网络平台推广方案
  • 做网站公司 信科网络/今日头条国际新闻
  • 网站开发团队奖惩/天门seo
  • 一个几个人做网站的几个故事电影/信息推广
  • kubeadm部署k8s集群环境搭建
  • 瑞萨e2studio:HardwareDebug配置项详解
  • 当机器猫遇上具身智能:一款能读懂宠物心思的AI守护者
  • 在职老D渗透日记day19:sqli-labs靶场通关(第26a关)get布尔盲注 过滤or和and基础上又过滤了空格和注释符 ‘)闭合
  • RISC-V汇编新手入门
  • 数据结构03(Java)--(递归行为和递归行为时间复杂度估算,master公式)