stark組件開發之URL分發和默認Handler
阿新 • • 發佈:2019-04-19
esp 生成 color 邏輯 定義 hid eight 2個 實例
為register 函數添加一個,prev參數,默認None ,用於可以讓用戶自己指定前綴。
def register(self, model_class, handler_class=None, prev=None): if handler_class is None: handler_class = StartHandler # 做個默認的Handler self._registry.append({‘model_class‘: model_class, "handler": handler_class(model_class), "prev": prev}) ‘‘‘ [ {‘model_class‘:models.Depart, "handler":DepartHandler(models.Depart),"prev": prev}, {‘model_class‘:models.UserInfo, "handler":UserInfoHandler(models.UserInfo),"prev": prev}, {‘model_class‘:models.Host, "handler":HostHandler(models.Host),"prev": prev}, ]
拼接時,判斷 prev 的值。 不為空的, 就需要拼接上前綴:
def get_urls(self): partterns = [] for item in self._registry: model_class = item["model_class"] handler = item["handler"] prev = item["prev"] # 獲取當前model_class所在的app名字 # 獲取當前model_class的類名,小寫def get_urls(self):app_label, model_name = model_class._meta.app_label, model_class._meta.model_name if prev: partterns.append(re_path(r"%s/%s/%s/list/$" % (app_label, model_name, prev), handler.check_list_view)) partterns.append(re_path(r"%s/%s/%s/add/$" % (app_label, model_name, prev), handler.add_view)) partterns.append(re_path(r"%s/%s/%s/change/(\d+)/$" % (app_label, model_name, prev), handler.change_view)) partterns.append(re_path(r"%s/%s/%s/del/$(\d+)/$" % (app_label, model_name, prev), handler.delete_view)) else: partterns.append(re_path(r"%s/%s/list/$" % (app_label, model_name), handler.check_list_view)) partterns.append(re_path(r"%s/%s/add/$" % (app_label, model_name), handler.add_view)) partterns.append(re_path(r"%s/%s/change/(\d+)/$" % (app_label, model_name), handler.change_view)) partterns.append(re_path(r"%s/%s/del/$(\d+)/$" % (app_label, model_name), handler.delete_view)) return partterns
到這裏還有一個,需要處理的就是。 一直都是默認直接,拼接的是一個,視圖函數。 如果我想要一個 路由分發的 url呢?
而且我這裏默認生成的是,4個URL。 如果只想要2個,或者三個呢? 這種邏輯,就不能用了!所以需要改變一下:
思路就是,利用類 查找變量的方式來做這件事情!
先將 register 的, 函數修改一下!
def register(self, model_class, handler_class=None, prev=None): if handler_class is None: handler_class = StartHandler # 做個默認的Handler self._registry.append({‘model_class‘: model_class, "handler": handler_class(model_class), "prev": prev}) ‘‘‘ [ {‘model_class‘:models.Depart, "handler":DepartHandler(models.Depart),"prev": prev}, {‘model_class‘:models.UserInfo, "handler":UserInfoHandler(models.UserInfo),"prev": prev}, {‘model_class‘:models.Host, "handler":HostHandler(models.Host),"prev": prev}, ] ‘‘‘ def get_urls(self): partterns = [] for item in self._registry: model_class = item["model_class"] handler = item["handler"] prev = item["prev"] # 獲取當前model_class所在的app名字 # 獲取當前model_class的類名,小寫 app_label, model_name = model_class._meta.app_label, model_class._meta.model_name if prev: partterns.append(re_path(r"%s/%s/%s/" % (app_label, model_name, prev), (handler.get_urls(), None, None))) else: partterns.append(re_path(r"%s/%s/" % (app_label, model_name), (handler.get_urls(), None, None))) return partterns
原來放 視圖函數的位置。 不再放視圖函數。 而是又做了一次的, 路由分發。
這樣, 依然能達到。 我們初始的效果。 為每張表, 定義了4個 URL。 增刪改查。
如果用戶不想使用默認的。 這就好辦了! 只需要在自己的類裏面, 定義一個 get_urls() 的方法。 就可以了!
因為,類的實例化對象, 在查找變量的時候。 會先從自己這裏找, 如果沒有 去自己的類中找。 如果再沒有才會去父類找。
這樣,只要用戶 自己定義了 get_urls() 那麽, 就會使用。 自己的這個方法! 而不會使用 基類的。
handler 是每張表自己的類。 我在基類StarkHandler中 定義, 視圖的功能:
class StarkHandler(object): def get_urls(self): partterns = [ re_path(r"list/$", self.check_list_view), re_path(r"add/$", self.add_view), re_path(r"change/(\d+)/$", self.change_view), re_path(r"del/$(\d+)/$", self.delete_view), ] partterns.extend(self.extra_url()) # 這個函數如果在子類中出現。 根據查找的原則。 會先去子類中查找。 return partterns def extra_url(self): return []
比如一個子類中這樣寫:(ps 此種情況只適合, 在原有基礎上增加URl)
class DepartHandler(StartHandler): ‘‘‘在原有的URL基礎上,再增加一個URL‘‘‘ def extra_url(self): return [ re_path("detail/(\d+)/$",self.detail_view) ] def detail_view(self): return HttpResponse("詳情頁")
比如一個子類中這樣寫:(ps 相要自己的url, 不想使用默認的)
class DepartHandler(StartHandler): ‘‘‘想要幾個URL 就 重寫get_urls()‘‘‘ def get_urls(self): return [ re_path("detail/(\d+)/$",self.detail_view),
re_path("list/$",self.check_list_view),
]
def detail_view(self):
return HttpResponse("詳情頁")
這樣, 就可以在運行的時候,執行自己的 get_urls() 方法。 就只會產生兩條,URL。
這裏用到的知識點: 類的實例化對象,在找變量的時候。 永遠都是先從自身找, 然後是自身的類中找。最後才會去父類尋找。
stark組件開發之URL分發和默認Handler