从3000行缩减到1000行,用django类代替视图函数

  • 博主最近写了一个网站, 要求同时支持简繁英三个版本, 为了网站快速被主流搜索引擎爬取收录, 网页所需数据由后端渲染好, 一次性返回给前端. 博主对django比较熟悉, 所有用django做了后端渲染
  • 网站1.0版本的需求很少, 就是几个静态页面, 在任何页面可以随时切换,简繁英三个版本, 不同语言面向的客户群不同, 内容也不相同, 所以, 博主用django视图函数, 写了三套独立的视图函数处理页面(很简单就完成了, 感觉很机智...)
  • 网站2.0版本, 新增了新闻页面, 后端的新闻接口, 靠zh-cn, zh-hk, en请求参数, 区分不同语言版本的请求数据, 对应的三个版本网站后端的渲染逻辑基本相同,这时候就出现了重复的代码(在泥泞的地面上, 挖了一个浅浅的坑)
  • 网站3.0版本, 新增基金信息, 基金净值展示, 分红信息, 公告文件下载等功能, 后端提供的接口依然靠zh-cn, zh-hk, en来区分三个语言版本, 这时, 后端渲染的逻辑, 重复度特别高, 视图函数单个文件的代码量一度达到3000行(深坑! 由于时间紧, 需求变化频繁, 也没时间重构项目, 复制,粘贴到怀疑人生, 3.0版本是含着泪做完的...)

项目完成后, 我迫不及待的进行了项目优化

  • 用类代替视图,从3000行缩减到1000行
  • 用类取代视图函数的逻辑非常简单, 两步就能搞定

第一步: 改写路由映射, 通过路由, 把 语言参数传进去

  • 原urls:
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^zh-cn/index$', views.zh_cn_index, name="zh_cn_index"),
    url(r'^zh-hk/index$', views.zh_hk_index, name="zh_hk_index"),
    url(r'^en/index$', views.en_index, name="en_index")
]
  • 修改后的urls(通过as.view()将Index作为视图处理函数使用, 并传入lang参数):
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^zh-cn/index$', views.Index.as_view(lang = "zh-cn"), name="zh_cn_index"),
    url(r'^zh-hk/index$', views.Index.as_view(lang = "zh-hk"), name="zh_hk_index"),
    url(r'^en/index$', views.Index.as_view(lang = "en"), name="en_index")
]

第二步: 将多个类似的函数转换为单个类

  • 原来用视图处理函数的方法写:
from django.shortcuts import render

# 中文版
def zh_cn_index(request):
    return render(request, 'pc/cn/index.html', locals())
# 繁体版
def zh_hk_index(request):
    return render(request, 'pc/hk/index_hk_amp.html', locals())
# 英文版
def en_index(request):
    return render(request, 'pc/en/index_en_amp.html', locals())
  • 现在用类的方法写:
from django.shortcuts import render
from django.views.generic import ListView

class Index(ListView):
    lang = ""
    def get(self, request):
        lang = self.lang
        if (lang == "zh-cn"):
            return render(request, 'pc/cn/index.html', locals())
        if (lang == "zh-hk"):
            return render(request, 'pc/hk/index_hk.html', locals())
        if (lang == "en"):
            return render(request, 'pc/en/index_en.html', locals())

用类取代三个重复的函数, 好处有以下三点

  • 减少代码量(原3000行, 现1000行)

  • 处理逻辑只写一份(为了简单, 这里省略了处理逻辑部分, 在实际开发中, 三种语言, 处理逻辑基本相同, 写一份就好了, 也便于后续的修改)
  • 良好的扩展性, 移动版和PC版所需的数据基本相同, 只是html的模板不同, 我们只需在urls里面, 将html的模板作为参数传入, 即可快速扩展出移动版

小结:

  • 开发经验这种东西, 踩的坑多了, 自然就有了
  • 如果有人告诉你, django要用类来减少视图函数的重复书写, 你可能会不以为然, 但亲身经历将3000重复代码简化到1000行不到的时候, 你自然也就接受了django要用类来减少视图函数的重复书写的观点...

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android-JessYan

一行代码实现Okhttp,Retrofit,Glide下载上传进度监听

原文地址: http://www.jianshu.com/p/5832c776621f qq群:301733278

1412
来自专栏Crossin的编程教室

这些年,你们一起踩过的坑(1)

编程教室创建5年多了,回答的问题不说上万也有好几千了。尽管大多数的问题在过去的文章以及论坛上都有讲过不止一遍,但因为不断有新人到来,难免还是被这些小坑磕磕绊绊一...

1235
来自专栏ytkah

群用户通过微信小程序可以更好地协作了

  今天,小程序向开发者开放了群ID的接口能力。简单地说,就是当你把小程序分享在群聊中,被点击后开发者可获取群ID和群名称,也方便更好地针对群场景提供个性化服务...

4895
来自专栏Golang语言社区

golang websocket总结(问题贴)

因为工作的需要,接触了websocket,开始的一些很简单的代码,都不知道该怎样运行起来,所以,总是有一层神秘感,却没有太多的兴趣去研究它。不过,还是免不了要了...

3063
来自专栏老付的网络博客

jekyll 如何转义字符

在使用jekyll去写博客的时候,有时候会输入双括号 或者是段html,但在jekyll默认会把对应的值赋到对应的字段占位上面,所以我们去想,如何去把这个输入做...

1102
来自专栏DannyHoo的专栏

利用plist文件查看后台返回数据的数据类型

当看客看到标题的时候或许会有些疑惑,有的人甚至会鄙视写者。查看后台返回的数据类型为什么要用plist文件,这也太麻烦了吧。我既然写这篇博客,肯定是有一定的原因的...

1061
来自专栏Java技术分享圈

杨老师课堂_Java教程第一篇之认识计算机

*接下来就是确定、确定、确定就ok! *检验环境变量是否成功在DOS命令行里输入javac或java,如果正常显示一些内容,说明安装成功并且配...

1002
来自专栏猿人谷

PHP程序员应该掌握的10个技能

php程序员应该掌握的10个技能,看看你都掌握了哪些:   1、语法:必须熟练掌握 ,写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语...

2257
来自专栏大闲人柴毛毛

使用Eclipse插件提高Java编码质量

代码质量概述 ? 怎样辨别一个项目代码写得好还是坏?优秀的代码和腐化的代码区别在哪里?怎么让自己写的代码既漂亮又有生命力?接下来将对代码质量的问题进行...

3337
来自专栏Golang语言社区

channel机理及调度理解

《Go语言编程》一书介绍了libtask库,可以认为这个库等同于go的底层goroutine实现。

1113

扫码关注云+社区

领取腾讯云代金券