专栏首页木子昭的博客从3000行缩减到1000行,用django类代替视图函数

从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 条评论
登录 后参与评论

相关文章

  • webpack手动配置React开发环境

    zhaoolee
  • 明星程序员被Google挂掉的故事

    首先要提一个软件Homebrew Homebrew可能是Mac上最好用的包管理器, 地位相当于Ubuntu的apt, 也相当于命令行版的AppStore ? ...

    zhaoolee
  • Python实现深度优先与广度优先

    二叉树的两种遍历是数据结构的经典考察题目, 广度遍历考察队列结构, 深度遍历考察递归 ? 二叉树 深度优先 先序遍历(父, 左子, 右子) 0,...

    zhaoolee
  • Python3 类

    Python类中的每个属性都必须有初始值。可以在__init__()方法内为某个属性设置默认初始值,此时无需包含为它提供初始值的形参。

    py3study
  • AI和机器学习获五角大楼”重用”,创建更强大的网络防御制度

    国防高级研究计划局(DARPA)正在推行一项前所未有的机器学习“突破性”技术,即开创一种网络安全新技术,旨在同时阻止多重攻击并尽量阻止现有防御系统无法识别的新型...

    大数据文摘
  • Spring Boot 2.0(二):Spring Boot 2.0尝鲜-动态 Banner

    Spring Boot 2.0 提供了很多新特性,其中就有一个小彩蛋:动态 Banner,今天我们就先拿这个来尝尝鲜。 配置依赖 使用 Spring Boot ...

    纯洁的微笑
  • Spring boot 2.0 新特性之动态 Banner

    Spring Boot 2.0 提供了很多新特性,其中就有一个小彩蛋:动态 Banner,今天我们就先拿这个来尝尝鲜。

    业余草
  • 2019年腾讯云服务器价格表(价格定价器)

    许多用户购买腾讯云服务器之前都想先查询下腾讯云服务器价格表,其实腾讯云有专门的价格计算器,只是很多用户没有注意到而已,腾讯云服务器价格通过价格计算器查询下就知道...

    人工智能谁与争锋
  • 修复KRACK漏洞,WPA3 Wi-Fi标准即将到来

    几个月前,WPA2安全协议被曝存在高危漏洞,容易遭受KRACK攻击,这几乎影响了所有的WIFI设备。为了从根本上解决这一问题,也促使新的WIFI网络保护协议WP...

    FB客服
  • 如何使用IDEA加载已有Spark项目

    背景是这样的:手上有一个学长之前实现的Spark项目,使用到了GraphX,并且用的Scala编写,现在需要再次运行这个项目,但如果直接在IDEA中打开项目,则...

    ZONGLYN

扫码关注云+社区

领取腾讯云代金券