当前位置: 首页 > 编程日记 > 正文

在 Django 的 View 中利用 function decorator 可实现一定程度的代码重用

在 Django 中,假设有几个 view, 他们都接受类似的参数,做类似的处理,最后又输出类似的变量到模板中配合显示,唯一不同的就是模板路径。

最普通的写法可能是这样:

def view_a(request, some_id):
    some_obj 
= SomeClass.objects.get(pk=some_id)
    
# 一些处理
    # dot.gif
    return render_to_response("a.html", {'some_obj': some_obj},
        context_instance
=RequestContext(request))

def view_b(request, some_id):
    some_obj 
= SomeClass.objects.get(pk=some_id)
    
# 一些处理
    # dot.gif
    return render_to_response("b.html", {'some_obj': some_obj},
        context_instance
=RequestContext(request))

def view_c(request, some_id):
    some_obj 
= SomeClass.objects.get(pk=some_id)
    
# 一些处理
    # dot.gif
    return render_to_response("c.html", {'some_obj': some_obj},
        context_instance
=RequestContext(request))

这里显然很多代码重复,最容易想到的是把同样的代码取出来放到一个函数里,重构后代码变成了这样:

def some_logic(request, some_id, template_path):
    some_obj 
= SomeClass.objects.get(pk=some_id)
    
# 一些处理
    # dot.gif
    return render_to_response(template_path, {'some_obj': some_obj},
        context_instance
=RequestContext(request))

def view_a(request, some_id):
    some_logic(request, some_id, 
"a.html")

def view_b(request, some_id):
    some_logic(request, some_id, 
"b.html")

def view_c(request, some_id):
    some_logic(request, some_id, 
"c.html")

好多了,可是我们注意到传递进 view 的一些参数(这里只有一个 some_id)仍然重复的写了很多次。有没有更好的办法呢?有的,用 function decorator,可以写成这样:

def foo_view(template_path):
    
def my_decorator(f):
        
def new_f(request, some_id, *args, **kwds):
            some_obj 
= SomeClass.objects.get(pk=some_id)
            
# 一些处理
            # dot.gif
            return render_to_response(template_path, {'some_obj': some_obj},
                context_instance
=RequestContext(request))
        new_f.func_name 
= f.func_name
        
return new_f
    
return my_decorator
            
@foo_view(
"a.html")
def view_a(request, some_id):
    
pass

@foo_view(
"b.html")
def view_b(request, some_id):
    
pass

@foo_view(
"c.html")    
def view_c(request, some_id):
    
pass

这样具体的 view 里面什么代码也没写,仅仅向 decorator 传递了一个模板名称的参数就搞定了。具体的实现,被封装到了 foo_view 这个 decorator 的内部函数里面。decorator 的作用看上去类似于 C# 的 Attribute, 但实际上强大很多,Attribute 仅仅相当于一个简单的元数据,具体实现还需要在其他类里面去分离实现,并且查找理解起来也不太方便,尤其在阅读大型类库的时候。而 python 里的 decorator 可以对函数做任意的修改,可任意添加前置(pre),后置(post) 操作,甚至完全取代掉原来的函数。可以辅助做参数、返回值类型检测、AOP (用的比较多的有日志、异常处理等)等功能,十分强大和灵活。

相关文章:

Linux---管理网络

一、ip基础知识1.ipv42进制32位-----10进制 172.25.0.10/255.255.255.0172.25.0.10:ip地址255.255.255.0:子网掩码子网掩码255位对应的ip位为网络位子网掩码0对应的ip位为主机位二、主机联网主机有两块网卡:有线和无线;&#xff0…

网络丢包现象分析处理指导书5

sniffer简明教程 xiong2127 51cto技术博客sniffer是由NAI公司提供的强大的协议分析仪,完整的sniffer系统,除了我们经常使用的以太网模块外,还具有广域网模块,广域网模块需要专用的硬件支持。比如E1/FR/POS/ATM等,均需要…

信息与计算机科学考研学校排名,计算机科学与技术考研学校排名

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼排名 学校名称 评估结果1 北京大学 A2 清华大学 A3 浙江大学 A4 国防科技大学 A5 北京航空航天大学 A6 北京邮电大学 A7 哈尔滨工业大学 A8 上海交通大学 A9 南京大学 A10 华中科技大学 A11 电子科技大学 A12 北京交通大学 A-13 北…

800万中文词,腾讯AI Lab开源大规模NLP数据集

参加 2018 AI开发者大会,请点击 ↑↑↑ 10 月19 日,腾讯 AI Lab 宣布开源大规模、高质量的中文词向量数据。该数据包含 800 多万中文词汇。 腾讯 AI Lab 表示,相比现有的公开数据,该数据在覆盖率、新鲜度及准确性上大幅提高&#…

屏幕后处理——Bloom

来自于《Unity Shader 入门精要》书本的学习 先上图 代码分3部分 1.PostEffectsBase.cs using System.Collections; using System.Collections.Generic; using UnityEngine; //在编辑器状态下可执行该脚本来查看效果 [ExecuteInEditMode] //屏幕后处理特效一般需要绑定在摄像…

服务端口大全+注解

端口:0服务:Reserved说明:通常用于分析操作系统。这一方法能够工作是因为在一些系统中“0”是无效端口,当你试图使用通常的闭合端口连接它时将产生不同的结果。一种典型的扫描,使用IP地址为0.0.0.0,设置ACK…

双绞线是计算机网络的一种通信线路吗,计算机网络环境的信道传输技术分析

韩长军【摘要】计算机网络的产生对人类文明进步树立了新标杆,促进了人们的交流,对于人类社会信息获得的途径以及咨询传播方式等等也产生了极其重大的影响。数据密集程度较高的科学和工程,比如、水文观测、地壳波动资料、气象行业等等&#xf…

为了智能驾驶,李彦宏要改造城市道路

10 月 18 日,在世界智能网联汽车大会上,百度 CEO 李彦宏提到:当汽车变得越来越智能,道路的基础设施也必须跟着变,必须进行改造。 李彦宏在发言中表示,“很多自动驾驶汽车都是需要依赖极其昂贵的激光雷达来实…

美团大脑:知识图谱的建模方法及其应用 | 公开课笔记

参加 2018 AI开发者大会,请点击 ↑↑↑分享嘉宾 | 王仲远(美团 AI Lab NLP 中心负责人)整 理 | 周翔出 品 | AI科技大本营作为人工智能时代最重要的知识表示方式之一,知识图谱能够打破不同场景下的数据隔离,为搜…

LINQ篇:ASP.NET using LINQ(Part One) Scott大师的产物

【原文地址】Using LINQ with ASP.NET (Part 1) 【原文发表日期】Sunday, May 14, 2006 9:49 PM 最近使我激动不已的新鲜事之一就是LINQ系列技术的出现,包括LINQ,DLINQ,XLINQ和不久后的其他技术。 LINQ将被完全集成到代号为Orcas的下个版本Vi…

大学生如何合理使用计算机,大学生计算机合理使用引导分析

摘 要:在当今社会中,计算机已经成为大家工作与生活不可缺少的工具。而在大学校园内,越来越多的学生也拥有了自己的计算机。计算机不仅可以帮助大学生进行学习活动,还能使学生在紧张学习之余进行娱乐放松。但是,大学生在…

关于机器学习中山峰聚类算法的说明

前言在之前关于聚类算法的文章中,笔者主要涉及的内容均是和参数求解相关的,如C均值(包括模糊C均值)、混合高斯模型等,而对于一些无参数密度估计的算法尚未讨论,而且一般基于参数密度估计的算法均是建立在假…

SQLDMO- (数据备份与恢复篇)

引用usingSystem;usingSystem.Collections.Generic;usingSystem.Text;publicsealedclassDbOper { /**//// <summary> /// DbOper类的构造函数 /// </summary> private DbOper() { } /**//// <summary> /// 数据库备份 /// </summary> …

详细介绍Java垃圾回收机制

垃圾收集GC&#xff08;Garbage Collection&#xff09;是Java语言的核心技术之一&#xff0c;之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性&#xff0c;但在JVM的内部运行机制上看&#xff0c;Java的垃圾回收原理与机制并未改变。垃圾收集的目的在于清除不再使用的对…

美国卡尔顿学院计算机专业怎么样,美国卡尔顿学院排名

在学术上&#xff0c;卡尔顿学院在美国处于领先地位。被美国新闻与世界报道评为全美前10位的文理学院卡尔顿学院排名卡尔顿学院是明尼苏达州菲尔德市一所历史悠久的文科私立院校&#xff0c;一直奉行无宗教派别男女合校制度。卡尔顿学院始建于1866年&#xff0c;经过一百多年的…

比特大陆发力边缘计算,详解终端AI芯片BM1880

作者 | 中国科学院微电子研究所 剑白 前不久比特大陆推出其云端人工智能芯片--SOPHON(算丰)BM1682芯片&#xff0c;BM1682是比特大陆设计&#xff0c;并对图像、视频等处理给予额外辅助支持的人工智能硬件加速芯片&#xff0c;其峰值运算速度为3TFLOPs&#xff0c;可提供给用户…

职称计算机 菏泽,山东菏泽2016年职称计算机首批考试时间

一、考试范围及科目(模块)1、参加2016年全国专业技术人员计算机应用能力考试的人员&#xff0c;须按照《2014版全国专业技术人员计算机应用能力考试科目(模块)代码表》(以下简称《2014版考试科目》)(见附件1)所列科目(模块)要求进行报名考试。2、评聘中级专业技术职务者&#x…

GitHub 挂了

参加 2018 AI开发者大会&#xff0c;请点击 ↑↑↑今天早上&#xff0c;全球最大的同性交友网站 GitHub 出现大规模宕机&#xff0c;你中招了没有&#xff1f;▌GitHub“挂了”“见鬼&#xff1f;&#xff1f;&#xff1f;”&#xff0c;一位 Twitter 用户评论道&#xff0c;“…

在ARC环境中autoreleasepool(runloop)的研究

引言 最近有个大佬考察了我关于autoreleasepool的了解, 之前一直认为自己了解, 但是稍微一问深, 自己却哑口无言. 仔细思考了下, 决定要将这个问题结合之前的知识从新梳理一下, 当然, 实践是必不可少的. main函数中的autoreleasepool的作用?系统的autoreleasepool我们自己创建…

QoS实验配置详解

QoS---CQ&#xff08;定制队列&#xff09;学习CQ&#xff08;定制队列&#xff09;的配置&#xff1b;本实验首先用ACL定义一些流量。然后再将这些流量进行先后排队&#xff0c;最后将排好队的流量策略应用到接口上 1 过滤流量R2(config)#access-list 101 permit ospf any any…

朴素贝叶斯分类器详解及中文文本舆情分析(附代码实践)

参加 2018 AI开发者大会&#xff0c;请点击 ↑↑↑作者 | 杨秀璋&#xff08;笔名&#xff1a;Eastmount&#xff09;&#xff0c;贵州财经大学信息学院老师&#xff0c;硕士毕业于北京理工大学&#xff0c;主要研究方向是Web数据挖掘、知识图谱、Python数据分析、图像识别等。…

计算机应用基础试题及答案试卷号7074,阅读文章,完成试题。后来才知道,在这千钧一发的时刻,是郝副营长划着了火柴,点燃了那本书,举得高高的, - 学进去中小学试卷试题库...

阅读《苏州园林》(节选)&#xff0c;回答问题。苏州园林(节选)叶圣陶①苏州园林据说有一百多处&#xff0c;我到过的不过十多处。其他地方的园林我也到过一些。倘若要我说说总的印象&#xff0c;我觉得苏州园林是我国各地园林的标本。②设计者和匠师们因地制宜&#xff0c;自出…

解决“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”...

[VS2005]解决“由于应用程序的配置不正确&#xff0c;应用程序未能启动&#xff0c;重新安装应用程序可能会纠正这个问题” 今天在准备发布用VS2005写的那个程序时&#xff0c;拷贝到我同事机器上&#xff0c;双击突然出现了“由于应用程序的配置不正确&#xff0c;应用程序未能…

PHP实时生成并下载超大数据量的EXCEL文件

最近接到一个需求&#xff0c;通过选择的时间段导出对应的用户访问日志到excel中&#xff0c; 由于用户量较大&#xff0c;经常会有导出50万加数据的情况。而常用的PHPexcel包需要把所有数据拿到后才能生成excel&#xff0c; 在面对生成超大数据量的excel文件时这显然是会造成内…

小学三年级上册计算机计划书,小学三年级班主任工作计划书

教学计划是教师个人制定的工作计划&#xff0c;通常为一个学期&#xff0c;内容主要包括制定教学计划的指导思想、教学内容以及教学目标&#xff0c;最重要的是每个教师要针对自己所带的学生特点来制定计划&#xff0c;因材施教才是对我们学生最好的教育.一、指导思想端正学习态…

10行代码爬取全国所有A股/港股/新三板上市公司信息

参加 2018 AI开发者大会&#xff0c;请点击 ↑↑↑作者 | 高级农民工本文已获原作者授权&#xff0c;如需转载&#xff0c;请联系原作者。摘要&#xff1a; 我们平常在浏览网页中会遇到一些表格型的数据信息&#xff0c;除了表格本身体现的内容以外&#xff0c;可能还想透过表格…

阿里云前端周刊 - 第 29 期

推荐 1. RESTful API 设计最佳实践 https://blog.philipphauer.de/... 项目资源的URL应该如何设计&#xff1f;用名词复数还是用名词单数&#xff1f;一个资源需要多少个URL&#xff1f;用哪种HTTP方法来创建一个新的资源&#xff1f;可选参数应该放在哪里&#xff1f;那些不涉…

Flash传值给asp页面

1.LoadVars的load方法&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;在flash中写一个拉出两个动态文件框&#xff0c;变量名为myName与myPsd&#xff0c;拉出一组件button&#xff0c;名为&#xff1a;submit_button&#xff0c;用于提交&#xff0c;再拉出一T…

《深度学习500问》,川大优秀毕业生的诚意之作

前端工程师掌握这18招&#xff0c;就能在浏览器里玩转深度学习基于知识图谱的人机对话系统 | 公开课笔记来呀&#xff01;AI喊你斗地主美团大脑&#xff1a;知识图谱的建模方法及其应用 | 公开课笔记60天,4位诺奖得主,他们将这样改造区块链程序员的江湖&#xff0c;务必掌握这些…

UC阿里鱼卡全网免流活动正在进行

UC&阿里鱼卡全网免流活动正在进行 优酷、虾米、高德、书旗应用专属流量免费 赠送100分钟国内通话、1G全国流量 扫码立即免费申请