strak組件(一):動態生成URL
阿新 • • 發佈:2019-03-19
.site 技術分享 pat model end let 處理 .sh handler
項目啟動時自動生成URL
效果圖:
知識點:
- Django啟動前通過apps下的ready方法執行一個可以生成URL的py文件
- include函數主要返回有三個元素的一個元組。第一個是url配置(urlpatterns),第二個是app(app_name),第三個是命名空間(namespace)。
- 通過單例模式,我們反復操作一個對象。
項目名:stark_practice
業務app:stark
stark app:stark
一、在業務表中生成數據庫
web/models.py
from django.db import modelsclass 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_modulesclass 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