day19 stark组件开发之提取公共视图函数,URL分发和默认Handler

上一节中,视图函数在每个app中单独写,造成代码冗余。这节我们把视图放入stark组件中供不同app调用
修改stark组件代码

stark/service/v1.py

# -*- encoding: utf-8 -*-
"""
@File    : v1.py
@Time    : 2022/1/16 19:59
@Author  : simon
@Email   : 294168604@qq.com
@Software: PyCharm
"""
from django.conf.urls import url
from django.shortcuts import HttpResponse, render


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

    def changelist_view(self, request):
        """
        列表页面
        :param request:
        :return:
        """
        # 访问http://127.0.0.1:8000/stark/app01/depart/list/; self.model_class = app01.models.Depart
        # 访问http://127.0.0.1:8000/stark/app01/userinfo/list/; self.model_class = app01.models.UserInfo
        # 访问http://127.0.0.1:8000/stark/app02/role/list/; self.model_class = app02.models.Role
        # 访问http://127.0.0.1:8000/stark/app02/host/list/; self.model_class =app02.models.Host
        # self.models_class
        data_list = self.model_class.objects.all()
        return render(request, 'stark/changelist.html', {'data_list': data_list})

    def add_view(self, request):
        """
        添加页面
        :param request:
        :return:
        """
        # self.models_class
        return HttpResponse('添加页面')

    def change_view(self, request, pk):
        """
        编辑页面
        :param request:
        :param pk:
        :return:
        """
        # self.models_class
        return HttpResponse('编辑页面')

    def delete_view(self, request, pk):
        """
        删除页面
        :param request:
        :param pk:
        :return:
        """
        # self.models_class
        return HttpResponse('删除页面')

    def get_urls(self):
        app_label, model_name = self.model_class._meta.app_label, self.model_class._meta.model_name
        if self.prev:
            patterns = [
                url(r'^list/$', self.changelist_view, name='%s_%s_%s_list' % (app_label, model_name, self.prev)),
                url(r'^add/$', self.add_view, name='%s_%s_%s_add' % (app_label, model_name, self.prev)),
                url(r'^change/(\d+)/$', self.change_view, name='%s_%s_%s_change' % (app_label, model_name, self.prev)),
                url(r'^delete/(\d+)/$', self.delete_view, name='%s_%s_%s_delete' % (app_label, model_name, self.prev)),
            ]
        else:
            patterns = [
                url(r'^list/$', self.changelist_view, name='%s_%s_list' % (app_label, model_name,)),
                url(r'^add/$', self.add_view, name='%s_%s_add' % (app_label, model_name,)),
                url(r'^change/(\d+)/$', self.change_view, name='%s_%s_change' % (app_label, model_name,)),
                url(r'^delete/(\d+)/$', self.delete_view, name='%s_%s_delete' % (app_label, model_name,)),
            ]
        patterns.extend(self.extra_urls())
        return patterns

    def extra_urls(self):
        return []


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

    def register(self, model_class, handler_class=None, prev=None):
        """

        :param model_class: 是models中的数据库表对应的类。 models.UserInfo
        :param handler_class: 处理请求的视图函数所在的类
        :return:
        """
        """
        self._registry = [
            {'model_class':models.Depart,'handler':DepartHandler(models.Depart)},
            {'model_class':models.UserInfo,'handler':UserInfoHandler(models.UserInfo)}
            {'model_class':models.Host,'handler': HostHandler(models.Host) }
        ]
        """
        if not handler_class:
            handler_class = StarkHandler
        self._registry.append({'model_class': model_class, 'handler': handler_class(model_class, prev), 'prev': prev})

    def get_urls(self):
        patterns = []
        for item in self._registry:
            model_class = item['model_class']
            handler = item['handler']
            prev = item['prev']
            app_label, model_name = model_class._meta.app_label, model_class._meta.model_name
            if prev:
                patterns.append(url(r'^%s/%s/%s/' % (app_label, model_name, prev,), (handler.get_urls(), None, None)))
            else:
                patterns.append(url(r'%s/%s/' % (app_label, model_name,), (handler.get_urls(), None, None)))

        return patterns

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


site = StarkSite()

创建模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>数据列表</h1>
<table border="1">
    {% for row in data_list %}
        <tr>
            <td>{{ row }}</td>
        </tr>
    {% endfor %}
</table>
</body>
</html>

修改app调用stark组件代码
app01/stark.py

# -*- encoding: utf-8 -*-
"""
@File    : stark_simon.py
@Time    : 2022/1/16 20:09
@Author  : simon
@Email   : 294168604@qq.com
@Software: PyCharm
"""
from django.conf.urls import url
from django.shortcuts import HttpResponse
from stark.service.v1 import site, StarkHandler
from app01 import models


class DepartHandler(StarkHandler):

    def extra_urls(self):
        """
        额外的增加URL
        :return:
        """
        return [
            url(r'^detail/(\d+)/$', self.detail_view)
        ]

    def detail_view(self, request, pk):
        return HttpResponse('详细页面')


site.register(models.Depart, DepartHandler)


class UserInfoHandler(StarkHandler):

    def get_urls(self):
        """
        修改URL
        :return:
        """
        patterns = [
            url(r'^list/$', self.changelist_view),
            url(r'^add/$', self.add_view),
        ]

        return patterns


site.register(models.UserInfo, UserInfoHandler)

app02/stark.py

# -*- encoding: utf-8 -*-
"""
@File    : stark_simon.py
@Time    : 2022/1/16 20:10
@Author  : simon
@Email   : 294168604@qq.com
@Software: PyCharm
"""



from django.shortcuts import HttpResponse
from stark.service.v1 import site, StarkHandler
from app02 import models


class HostHandler(StarkHandler):
    pass


site.register(models.Host, HostHandler)

site.register(models.Role)

site.register(models.Project)
site.register(models.Project, prev='private')

启动程序效果

posted @   simon_T  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示