博主最近写了一个网站, 要求同时支持简繁英三个版本, 为了网站快速被主流搜索引擎爬取收录, 网页所需数据由后端渲染好, 一次性返回给前端. 博主对 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 要用类来减少视图函数的重复书写
的观点...
来源: http://www.jianshu.com/p/edb3208f2caa