1. 程式人生 > >stark組件開發之URL分發和默認Handler

stark組件開發之URL分發和默認Handler

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的類名,小寫
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
def get_urls(self):

到這裏還有一個,需要處理的就是。 一直都是默認直接,拼接的是一個,視圖函數。 如果我想要一個 路由分發的 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