1. 程式人生 > >從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要用類來減少檢視函式的重複書寫的觀點...