ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Deis web 模块源码解析:web.urls、web.views 与 gravatar 模板标签的完整实现

Deis web 模块源码解析:web.urls、web.views 与 gravatar 模板标签的完整实现 后端云原生【免费下载链接】deisDeis v1, the CoreOS and Docker PaaS: Your PaaS. Your Rules.项目地址https://gitcode.com/gh_mirrors/de/deis点击查看免费下载本文基于 Deis 控制器的 Python API 参考页docs/reference/server/web.rst对其中收录的web.urls、web.views、web.templatetags.gravatar_tags三个模块逐一展开源码级讲解并结合 deis/urls.py、deis/settings.py 与 tests.py 说明 Web UI 的挂载方式、WEB_ENABLED开关机制、登录鉴权链路与测试验证方式。读完你可以完整理解 Deis 控制台页面Dashboard / Apps / Account / Support背后的路由与视图实现以及 Gravatar 头像标签从模板到输出的整个渲染流程。文档骨架三个 automodule 章节参考文档 web.rst 本身由 Sphinx 的automodule指令自动生成共列出三个模块条目文档章节对应源码作用web.urlscontroller/web/urls.pyWeb 应用的路由规则web.viewscontroller/web/views.py四个控制台页面视图web.templatetagscontroller/web/templatetags/gravatar_tags.pyGravatar 头像 URL 模板标签下面逐一展开所有结论均可在对应源码文件中核对。web.urls四条路由与视图名前缀urls.py 全文很短核心就是urlpatternsurlpatterns patterns( web.views, url(r^$, dashboard, namedashboard), url(r^account/$, account, nameaccount), url(r^apps/$, apps, nameapps), url(r^support/$, support, namesupport), )几个实现要点patterns(web.views, ...)第一个参数是视图模块前缀后面每条url的第二个参数dashboard、account等是裸函数名Django 会拼成web.views.dashboard之类的完整路径去导入视图函数四条路由分别对应根路径^$→ Dashboard 首页/account/、/apps/、/support/三个子页面每条路由都带name模板中可用{% url apps %}反向解析dashboard.html 第 10 行即用{% url apps %}生成跳转链接。需要注意的是web.urls不是整个控制器的根路由。真正的主路由文件是 deis/urls.pyurlpatterns patterns( , url(r^healthz$, HealthCheckView.as_view()), url(r^v1/, include(api.urls)), ) if settings.WEB_ENABLED: urlpatterns patterns( , url(r^, include(web.urls)), url(r^admin/, include(admin.site.urls)), )见 deis/urls.py#L19-L30也就是说/healthz与/v1/REST API 始终存在而web.urls挂在根路径^下、Django admin 挂在/admin/下二者都受WEB_ENABLED开关控制。由于 web 路由挂在根路径WEB_ENABLED为 False 时根路径请求会落入 API 路由并返回 404——这正是 Deis 默认纯 API 模式的表现。web.views四个带登录保护的页面视图views.py 提供四个视图全部使用django.contrib.auth.decorators.login_required装饰这是 Web 模块唯一的鉴权手段from django.contrib.auth.decorators import login_required from django.shortcuts import render from api.models import App from deis import __version__ login_required def account(request): Return the users account web page. return render(request, web/account.html, { page: account, }) login_required def dashboard(request): Return the users dashboard web page. apps App.objects.filter(ownerrequest.user) return render(request, web/dashboard.html, { page: dashboard, apps: apps, version: __version__, }) login_required def apps(request): Return the users apps web page. apps App.objects.filter(ownerrequest.user) return render(request, web/apps.html, { page: apps, apps: apps, }) login_required def support(request): Return the support ticket system home page. return render(request, web/support.html, { page: support, })见 views.py#L12-L46数据流上有两个值得注意的点Dashboard 与 Apps 页面共享同一条查询App.objects.filter(ownerrequest.user)即只列出当前登录用户拥有的应用未做任何跨用户共享逻辑版本号来源dashboard视图从 deis/init.py 导入__version__并传入模板dashboard.html 中渲染为Connected to Deis controller v{{ version }} at {{ site.domain }}site变量则来自 settings.py 中注册的deis.context_processors.site上下文处理器。未登录时跳转到哪里login_required未认证时会 302 到settings.LOGIN_URL。在 settings.py#L167-L168 中定义为LOGIN_URL /v1/auth/login/ LOGIN_REDIRECT_URL /即 Web UI 的登录页复用了v1 REST API 的 Token 登录接口浏览器端对应的模板是 templates/rest_framework/login.html。这是一个很典型的 Deis v1 设计Web 前端本身不实现认证登录/注册全部交给 API 层的 Token 认证体系。web.templatetags.gravatar_tags一个自定义模板标签的完整实现gravatar_tags.py 是文档第三个automodule章节对应的模块实现了一个{% gravatar_url email %}模板标签完整源码如下import hashlib import urllib from django import template register template.Library() class GravatarUrlNode(template.Node): def __init__(self, email): self.email template.Variable(email) def render(self, context): try: email self.email.resolve(context) except template.VariableDoesNotExist: return # default http://example.com/static/images/defaultavatar.jpg default mm # Mystery Man size 24 return //www.gravatar.com/avatar/{}?{}.format( hashlib.md5(email.lower()).hexdigest(), urllib.urlencode({d: default, s: str(size)})) register.tag def gravatar_url(_parser, token): try: _tag_name, email token.split_contents() except ValueError: raise template.TemplateSyntaxError( {} tag requires a single argument.format( token.contents.split()[0])) return GravatarUrlNode(email)实现细节可以拆成三层标签解析层gravatar_urlregister.tag装饰的函数对 token 做split_contents()要求恰好一个参数邮箱表达式否则抛出TemplateSyntaxError。这解释了为什么测试里{% gravatar_url %}会触发语法错误见下文测试章节节点求值层GravatarUrlNode把参数保存为template.Variable渲染时才resolve(context)若上下文中该变量不存在捕获VariableDoesNotExist并返回空字符串而非报错保证模板不因缺失邮箱而崩溃URL 生成层对email.lower()做 MD5 得到 Gravatar 哈希拼接协议相对地址//www.gravatar.com/avatar/{md5}?dmms24。其中dmm表示未配置头像时回退为 Mystery Man 灰人图s24为请求尺寸单位像素注释中还保留了一个被注释掉的自定义默认头像路径选项default http://example.com/...说明这里可以换成站点静态图。实际使用处templates/web/account.html 第 2、14 行{% load gravatar_tags %} ... img src{% gravatar_url user.email %} classimg-circle height64 width64注意模板里请求的头像显示尺寸是 64x64而标签内请求的 Gravatar 原图是 24px——浏览器会把 24px 原图放大到 64px 显示这是当前实现的一个小瑕疵但从源码结构看作者把size写死为 24 的取舍可能是为了多数列表场景的轻量加载。WEB_ENABLEDWeb UI 的三级开关机制Web 模块能否被访问取决于settings.WEB_ENABLED它在仓库中有三级来源优先级从低到高1. 代码默认值关闭— settings.py#L323-L324# check if we should enable the web UI module WEB_ENABLED FalseDeis 默认以纯 API 形态部署Web UI 是可选组件。2. 开发者本地覆盖— settings.py#L364-L368 允许在仓库外的local_settings.py中写入任意覆盖项注释明确提醒不要提交进版本库try: from .local_settings import * # noqa except ImportError: pass3. 容器内 confd 动态生成最高优先级— settings.py#L370-L374# have confd_settings within container execution override all others # including local_settings (which may end up in the container) if os.path.exists(/templates/confd_settings.py): sys.path.append(/templates) from confd_settings import * # noqa而/templates/confd_settings.py由 confd 依据 conf.d/confd_settings.toml 渲染生成。该 toml 声明监听 etcd 键空间/deis/controller等 7 个前缀模板源文件为 templates/confd_settings.py其中与 Web 开关相关的片段第 44-46 行是{{ if exists /deis/controller/webEnabled }} WEB_ENABLED bool({{ getv /deis/controller/webEnabled }}) {{ end }}即只有当 etcd 中显式写入/deis/controller/webEnabled键true/false时渲染出的confd_settings.py才会覆盖默认值confd 变更触发reload_cmd /app/bin/reload重载 gunicorn。因此运维上开启 Web UI 的标准做法是向 etcd 写入/deis/controller/webEnabledtrue例如etcdctl set /deis/controller/webEnabled true无需修改任何代码。测试代码也印证了这一开关tests.py#L20-L22 中setUpClass显式settings.WEB_ENABLED True否则测试客户端访问/、/account/等路由时将因web.urls未挂载而得到 404。测试验证views 与模板标签的行为契约unit tests 用./manage.py test web运行文件头注释原话依赖 fixture fixtures/test_web.json。该 fixture 造了两个用户autotest-1/autotest-2密码password和一个归属autotest-1的应用autotest-1-app。测试断言把上文源码行为固化成了契约视图层WebViewsTestself.client.login(usernameautotest-1, passwordpassword)后访问GET /account/→ 响应含titleDeis | Account/title、用户名autotest-1与img src//www.gravatar.com/avatar——最后一项直接验证了 account 页面调用了gravatar_url标签GET /→titleDeis | Dashboard/titleGET /apps/→titleDeis | Apps/title、h1One App/h1、h3autotest-1-app/h3——与App.objects.filter(ownerrequest.user)的过滤逻辑一一对应GET /support/→ 页面含forkImage区块及IRC、GitHub两个支持渠道标题对应 templates/web/support.html。模板标签层GravatarTagsTest三个用例覆盖了标签的全部分支正常渲染——{% gravatar_url email %}在{email: githubdeis.io}上下文下必须输出//www.gravatar.com/avatar/058ff74579b6a8fa1e10ab98c990e945?s24dmm即md5(githubdeis.io.lower())的十六进制值加s24dmm查询串urllib.urlencode按字母序输出d在前s在后——实际输出s24dmm取决于 Python 2 字典序列化顺序测试值即实现事实语法错误——{% gravatar_url %}缺参必须抛TemplateSyntaxError上下文缺变量——空上下文下渲染结果必须是空字符串。这三个用例与 gravatar_tags.py 中的TemplateSyntaxError、VariableDoesNotExist分支精确对应可作为理解该标签全部行为边界的依据。小结web 模块的边界与定位结合源码可以明确 Deis v1 web 模块的职责边界它不定义任何模型models.py 为空文件所有数据来自api.models.App与 Django 内置auth.User它是纯展示层四个视图只做查询与渲染写操作创建应用、部署等仍走/v1/REST API 与deisCLI静态资源位于 web/static/Bootstrap 2.x 系列 CSS/JS 与样式表 deis-controller.css页面模板继承 templates/web/base.html默认关闭WEB_ENABLED False通过 etcd 键/deis/controller/webEnabled confd 模板渲染来开启且开启后额外暴露 Django admin/admin/。如果你需要进一步追踪相关实现建议按以下路径深入controller/web/views.py视图逻辑、controller/web/templates/web/四个页面模板、controller/deis/settings.py认证、CORS、REST 框架配置、controller/web/tests.py行为契约。赞分享后端云原生【免费下载链接】deisDeis v1, the CoreOS and Docker PaaS: Your PaaS. Your Rules.项目地址https://gitcode.com/gh_mirrors/de/deis点击查看免费下载相关推荐Deis Controller 的 registry.dockerclient 模块解析Docker 镜像发布的 API 参考与源码实现Deis Controller 的 registry.dockerclient 模块解析Docker 镜像发布的 API 参考与源码实现 本文以 Deis 服后端云原生SurfSense 元标签代码模板实战指南Open Graph、Twitter Card 与完整 Meta 标签块编写规范SurfSense 元标签代码模板实战指南Open Graph、Twitter Card 与完整 Meta 标签块编写规范 本篇技术指南围绕仓库中 .curs人工智能AI 应用后端AI Agent网页爬虫RAG深度研究MCP 服务前端AnyText源码解析从cldm模块到扩散模型的完整实现AnyText源码解析从cldm模块到扩散模型的完整实现 AnyText是一个强大的多语言视觉文本生成与编辑框架能够在各种场景中生成和编辑高质量的文本图像。人工智能大模型媒体生成计算机视觉深度学习上一篇SRWE终极指南5分钟掌握实时窗口分辨率控制技术下一篇Candle Mamba MinimalRust 版 Mamba 最小实现与端到端文本生成实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进