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')
启动程序效果
分类:
crm系统开发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具