1. 程式人生 > >strak組件(一):動態生成URL

strak組件(一):動態生成URL

.site 技術分享 pat model end let 處理 .sh handler

項目啟動時自動生成URL

效果圖:

技術分享圖片

技術分享圖片

知識點:

  1. Django啟動前通過apps下的ready方法執行一個可以生成URL的py文件
  2. include函數主要返回有三個元素的一個元組。第一個是url配置(urlpatterns),第二個是app(app_name),第三個是命名空間(namespace)。
  3. 通過單例模式,我們反復操作一個對象。

項目名:stark_practice

業務app:stark

stark app:stark

一、在業務表中生成數據庫

web/models.py

from django.db import models


class Department(models.Model): """ 部門表 """ title = models.CharField(verbose_name=部門名稱, max_length=32) class UserInfo(models.Model): """ 用戶表 """ name = models.CharField(verbose_name=姓名, max_length=32) age = models.CharField(verbose_name=年齡, max_length=32) email
= models.CharField(verbose_name=郵箱, max_length=32) department = models.ForeignKey(verbose_name=部門, to=Department, on_delete=models.CASCADE)

二、加載django項目時自動執行stark文件

stark.apps.py

from django.apps import AppConfig
from django.utils.module_loading import autodiscover_modules


class StarkConfig(AppConfig): name = stark def ready(self): autodiscover_modules(stark) # 執行名為stark的py文件

三、stark組件

stark/service/core_function.py

from django.urls import re_path


class StarkSite(object):
    def __init__(self):
        self._registry = []
        self.app_name = stark
        self.namespace = stark

    def register(self, model_class, handler_class):
        """
        :param model_class: 是models中的數據庫表對應的類。
        :param handler_class: 處理請求的視圖函數所在的類
        :return:
        """
        """
        self._registry = [
           {‘model_class‘: model.Department,‘handler‘:DepartmentHandler(models.Department)},
           {‘model_class‘: model.UserInfo,‘handler‘:UserInfo(models.UserInfo)}, 
           {‘model_class‘: model.Host,‘handler‘:Host(models.Host)},
        ]
        """
        # 註意:handler_class接收的第一個參數是數據庫表對應的類
        self._registry.append({model_class: model_class, handler: handler_class(model_class)})

    def get_urls(self):
        patterns = []
        for item in self._registry:
            model_class = item[model_class]
            handler = item[handler]
            app_name = model_class._meta.app_label  # 獲取當前類所在的app
            model_name = model_class._meta.model_name  # 獲取當前類所在的表名稱
            patterns.append(re_path(r%s/%s/list % (app_name, model_name), handler.list_view))
            patterns.append(re_path(r%s/%s/add % (app_name, model_name), handler.add_view))
            patterns.append(re_path(r%s/%s/edit % (app_name, model_name), handler.edit_view))
            patterns.append(re_path(r%s/%s/delete % (app_name, model_name), handler.delete_view))

        return patterns

    @property
    def urls(self):
        return self.get_urls(), self.app_name, self.namespace


site = StarkSite()

四、使用strak組件

web/stark.py

from django.shortcuts import HttpResponse
from stark.service.core_func import site

from web import models


class DepartmentHandler(object):
    def __init__(self, model_class):
        self.model_class = model_class

    def list_view(self, request):
        """
        列表頁面
        :param request:
        :return:
        """
        return HttpResponse(列表頁面)

    def add_view(self, request):
        """
        添加頁面
        :param request:
        :return:
        """
        return HttpResponse(添加頁面)

    def edit_view(self, request):
        """
        編輯頁面
        :param request:
        :return:
        """
        return HttpResponse(編輯頁面)

    def delete_view(self, request):
        """
        刪除頁面
        :param request:
        :return:
        """
        return HttpResponse(刪除頁面)


class UserInfoHandler:
    def __init__(self, model_class):
        self.model_class = model_class

    def list_view(self, request):
        """
        列表頁面
        :param request:
        :return:
        """
        return HttpResponse(列表頁面)

    def add_view(self, request):
        """
        添加頁面
        :param request:
        :return:
        """
        return HttpResponse(添加頁面)

    def edit_view(self, request):
        """
        編輯頁面
        :param request:
        :return:
        """
        return HttpResponse(編輯頁面)

    def delete_view(self, request):
        """
        刪除頁面
        :param request:
        :return:
        """
        return HttpResponse(刪除頁面)


site.register(models.Department, DepartmentHandler)
site.register(models.UserInfo, UserInfoHandler)

五、註冊URL

stark_practice/urls.py

from django.contrib import admin
from django.urls import path, re_path

from stark.service.core_func import site

urlpatterns = [
    path(admin/, admin.site.urls),
    re_path(r^stark/, site.urls),

]

strak組件(一):動態生成URL