ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Open edX 平台 Web(HTML)课程证书全解析:从 PDF 迁移决策到证书配置与查看

Open edX 平台 Web(HTML)课程证书全解析:从 PDF 迁移决策到证书配置与查看 Open edX 平台 WebHTML课程证书全解析从 PDF 迁移决策到证书配置与查看【免费下载链接】openedx-platformThe Open edX LMS Studio, powering education sites around the world!项目地址: https://gitcode.com/GitHub_Trending/ed/openedx-platform导读本文以 Open edX 平台edx-platform 仓库中 证书模块的 ADR-003 决策记录 为核心系统讲解平台为何全面转向 WebHTML课程证书、如何正确配置课程运行course run使其证书可查看、如何通过数据库查询定位需要更新的课程以及 Web 证书的最终查看方式与底层渲染原理。读完本文你将掌握 Open edX 课程证书从PDF 时代向Web 证书时代迁移的完整脉络并能独立完成课程证书的启用、配置、排查与验证。一、决策背景为什么平台要全面转向 Web 证书1.1 PDF 证书代码的历史遗留Open edX 平台edx-platform长期以来同时维护着 PDF 与 WebHTML两种课程证书的实现代码。随着时间推移PDF 证书相关的代码被逐步弃用deprecated或禁用disabled。特别是平台已经有一段时间不再支持 PDF 课程证书的生成——这一点在决策记录中明确说明且与代码事实一致在 GeneratedCertificate 模型 中download_uuid、download_url、error_reason、key等字段虽然仍然保留在模型上但注释明确指出它们是虽然保留但已不再使用的历史遗留字段参见 008-certificate-model-remnants.rst保留它们仅是为了兼容历史数据。1.2 决策结论只保留 Web 证书本决策记录003-web-certs.rst的状态为Accepted已接受核心决策可以概括为三点未来将删除 edx-platform 中所有与 PDF 证书相关的代码只允许生成和查看 Web 证书删除分两步走第一步先删除 PDF 证书的生成代码第二步再删除查看历史 PDF 证书的代码所有使用课程证书的课程运行course run都应配置为使用 Web 证书。从仓库证据看这一决策确实已经逐步落地迁移文件 0038_pdf_certificate_purge_data_management.py 与配套的管理命令 purge_references_to_pdf_certificates.py 专门负责清理与 PDF 证书相关的历史数据引用证书模块目录下的测试 test_purge_references_to_pdf_certificates.py 覆盖了该清理命令的行为。也就是说本文所讨论的Web 证书不是一种可选的证书形式而是 Open edX 平台当前及未来唯一支持的课程证书形态。二、Web 证书可查看的三个必要条件决策记录明确指出一个 Web 证书要能够被查看必须同时满足以下三个条件条件作用层级对应标志CERTIFICATES_HTML_VIEW功能全局启用平台级settingssettings.CERTIFICATES_HTML_VIEW课程运行已启用 Web 证书课程运行级CourseOverview 的cert_html_view_enabled True课程运行已创建并激活至少 1 个证书课程运行级CourseOverview 的has_any_active_web_certificate True这三个条件在源码中被一一验证缺一不可。在 Web 证书渲染入口 views/webview.py 的render_html_view函数中可以看到严格的逐级拦截逻辑全局开关检查第 478 行if not settings.CERTIFICATES_HTML_VIEW:直接返回Invalid页面课程级开关检查第 498 行if not course.cert_html_view_enabled:同样返回Invalid页面并记录日志证书存在性检查第 507-514 行调用_get_user_certificate获取用户的可下载downloadable状态证书不存在则返回Invalid页面激活证书配置检查第 519-526 行调用get_active_web_certificate(course, preview_mode)若课程没有处于激活状态的证书配置同样返回Invalid页面。换句话说三个必要条件在渲染链路中被逐一验证任何一环不满足用户看到的都是无效证书页面而非真正的证书。三、如何配置 Web 证书三个条件的逐项落地3.1 全局启用CERTIFICATES_HTML_VIEWCERTIFICATES_HTML_VIEW是 Django settings 中的一个布尔型全局开关。启用方式是在平台的 Django 配置例如 lms/envs/common.py、cms/envs/common.py 或你的部署私有配置中将其设为True# 平台全局启用 HTMLWeb证书视图 CERTIFICATES_HTML_VIEW True测试代码大量使用override_settings(CERTIFICATES_HTML_VIEWTrue)来模拟这一开关的开启与关闭参见 test_webview_views.py 与 test_utils.py这从侧面印证了该设置是 Web 证书功能的总闸关闭时连证书 URL 的构造行为都会随之改变。3.2 课程运行启用 Web 证书课程运行级开关对应 CourseOverview 模型上的cert_html_view_enabled字段。从源码看该字段的默认值为False见 course_overviews/models.py需要显式启用。在 Open edX 的 StudioCMS中通过Set Up Certificates中的Enable a Certificate步骤来启用它。其底层数据同步逻辑在 course_overviews/models.py 中course_overview.cert_html_view_enabled course.cert_html_view_enabled即课程块course block上的证书设置会被同步到 CourseOverview 表中供 LMS 侧高效读取和判断。3.3 创建并激活证书课程运行必须在 Studio 中完成Create a Certificate创建证书与Activate a Certificate激活证书两步才会在 CourseOverview 上得到has_any_active_web_certificate True。其底层判断逻辑同样在 course_overviews/models.pycourse_overview.has_any_active_web_certificate (get_active_web_certificate(course) is not None)而get_active_web_certificate的实现位于 lms/djangoapps/certificates/api.py它读取课程块certificates配置中的certificates列表遍历找到第一个is_active为真的配置并返回找不到则返回None。因此激活证书本质上就是在课程的证书配置列表中把某个证书配置的is_active置为 True。四、排查找出所有需要更新为 Web 证书的课程运行由于历史原因数据库中可能存在大量可下载证书但未正确配置 Web 证书的课程运行。决策记录提供了一条标准的 SQL 查询用于找出这些课程。该查询基于两张表CERTIFICATES_GENERATEDCERTIFICATE对应 GeneratedCertificate 模型 的数据表记录每个用户获得的证书含status、verify_uuid等字段COURSE_OVERVIEWS_COURSEOVERVIEW对应 CourseOverview 模型的数据表记录每个课程运行的概览信息含cert_html_view_enabled、has_any_active_web_certificate两个标志。原始查询如下select distinct cert.course_id from CERTIFICATES_GENERATEDCERTIFICATE as cert join COURSE_OVERVIEWS_COURSEOVERVIEW as overview on cert.course_id overview.id where cert.status downloadable and ( overview.cert_html_view_enabled False or overview.has_any_active_web_certificate False ) order by cert.course_id4.1 查询逻辑解读cert.status downloadable只关注已经发放、处于可下载状态的证书。根据 data.py 中的 CertificateStatuses 定义downloadable表示用户已获得该证书且证书就绪可用是当前证书代码实际会写入的状态之一两个or条件分别对应前面三个必要条件中的后两个——要么课程没有启用 Web 证书要么课程没有激活的 Web 证书distinct去重后按course_id排序输出的是需要处理的课程运行 ID 列表。4.2 查询结果的处置流程拿到这份课程列表后对每个课程运行执行第 3 节中的配置步骤启用课程证书、创建并激活证书即可让存量课程也切换到 Web 证书。这正是决策记录中所有使用课程证书的课程运行都应配置为使用 Web 证书这一要求在运维层面的落地动作。五、查看 Web 证书URL 构造与渲染链路5.1 手动查看的 URL 构造决策记录给出的手动查看流程如下确定站点的 base URL例如 edX 官方站点为https://courses.edx.org/在CERTIFICATES_GENERATEDCERTIFICATE表中找到目标证书记录取出该记录的verify_uuid字段将其拼接到 base URL 之后形如https://courses.edx.org/certificates/verify_uuid其中verify_uuid是每个证书的唯一标识符。在 GeneratedCertificate 模型 中该字段定义为CharField(max_length32, db_indexTrue)即一个 32 位十六进制字符串并建有数据库索引以支持快速查询。5.2 URL 路由与视图处理从 证书模块的 URL 配置 可以看到这条 URL 被路由到公开视图re_path( r^(?Pcertificate_uuid[0-9a-f]{32})$, views.render_cert_by_uuid, namerender_cert_by_uuid ),即 URL 中的 32 位十六进制 UUID 会作为certificate_uuid参数传入 render_cert_by_uuid。该视图通过GeneratedCertificate.eligible_certificates.get(verify_uuidcertificate_uuid, statusCertificateStatuses.downloadable)精确查找证书记录找不到则抛出Http404找到则调用核心渲染函数render_html_view输出 HTML 页面。值得注意的细节查询使用的是eligible_certificates管理器而非默认的objects管理器。从 models.py 中的 EligibleCertificateManager 可以看到该管理器会在查询时内联关联course_overviews_courseoverview表过滤掉已失效证书以及课程已不存在的孤儿证书记录——这也再次印证了 CourseOverview 表在证书可查看性判断中的核心地位。5.3 渲染链路源码剖析render_html_viewwebview.py是 Web 证书渲染的核心函数其完整检查与渲染流程为全局开关检查settings.CERTIFICATES_HTML_VIEW为假 → 返回Invalid页课程解析通过CourseKey.from_string解析课程 ID 并加载课程块失败非法 key 或课程不存在→ 返回Invalid页课程级开关检查course.cert_html_view_enabled为假 → 记录日志并返回Invalid页用户证书获取调用_get_user_certificate——普通模式下要求用户存在状态为downloadable的合格证书预览模式下则临时构造一个GeneratedCertificate实例此时需要调用者拥有PREVIEW_CERTIFICATES权限激活证书配置检查get_active_web_certificate返回None→ 返回Invalid页上下文组装依次组装站点基础信息_update_context_with_basic_info、组织信息_update_organization_context、课程信息_update_course_context、用户信息_update_context_with_user_info、社交分享信息_update_social_context与证书信息_update_certificate_context并合并课程高级设置中的cert_html_view_overrides覆盖值模板渲染若启用了自定义模板CUSTOM_CERTIFICATE_TEMPLATES_ENABLED则按组织、课程、模式、语言逐级匹配 CertificateTemplate 中的活动模板否则渲染默认模板certificates/valid.html过滤器扩展渲染前会触发CertificateRenderStarted学习过滤器org.openedx.learning.certificate.render.started.v1允许插件实现替代响应、重定向或自定义响应见 webview.py。5.4 无法查看时的排查方向决策记录特别提醒如果课程运行没有正确配置 Web 证书证书将无法查看。结合前文的渲染链路常见的证书不可见原因与对应排查点如下现象首要排查点平台所有证书都打不开检查CERTIFICATES_HTML_VIEW是否为True单个课程证书打不开检查该课程是否执行了Enable a Certificatecert_html_view_enabled课程已启用但仍打不开检查是否执行了Create与Activatehas_any_active_web_certificate特定用户打不开检查该用户在CERTIFICATES_GENERATEDCERTIFICATE中是否有statusdownloadable的记录课程与用户都正常仍打不开检查证书 URL 中的verify_uuid是否为 32 位十六进制且与表内记录一致六、决策影响与后续演进方向6.1 对平台使用者的影响决策记录的Consequences部分明确了两点操作指引使用课程证书需按照Enable Course Certificates与Set Up Certificates in Studio两份文档完成配置所有使用课程证书的课程运行都应配置为 Web 证书一旦 PDF 生成与查看代码被彻底移除Web 证书将成为唯一可生成、可查看的证书形态。6.2 对平台代码演进的影响从当前仓库的代码状态看这一决策的影响已经清晰可见模型层面download_uuid、download_url、error_reason等 PDF 专属字段仅作为历史遗留保留由 ADR 008-certificate-model-remnants.rst 记录其处置方式数据层面迁移 0038_pdf_certificate_purge_data_management.py 与管理命令 purge_references_to_pdf_certificates.py 用于清理 PDF 相关历史数据功能层面证书的生成、激活、查看、模板定制含多语言模板 CertificateTemplate.language 与学习时长等富信息展示全部围绕 Web 证书构建PDF 相关逻辑从功能链路上基本退出。6.3 进一步阅读如果想深入了解证书模块的更多设计决策仓库中还有一系列相关联的 ADR 文档可供研读001-allowlist-cert-requirements.rst证书白名单allowlist要求002-cert-requirements.rst证书获取条件004-cert-status.rst证书状态机设计005-cert-display-settings.rst证书展示设置006-cert-date-override.rst证书日期覆盖008-certificate-model-remnants.rst证书模型的遗留字段处置此外证书模块的入口 APIlms/djangoapps/certificates/api.py、核心模型lms/djangoapps/certificates/models.py、Web 视图lms/djangoapps/certificates/views/webview.py以及完整的视图测试test_webview_views.py都值得作为深入阅读的源码入口。结语Open edX 平台通过 ADR-003 明确了去 PDF、全面 Web 化的课程证书路线全局开关CERTIFICATES_HTML_VIEW、课程级开关cert_html_view_enabled与激活证书has_any_active_web_certificate三个条件共同决定证书的可查看性运维人员可以用标准 SQL 批量排查存量课程终端用户则通过base_url/certificates/verify_uuid直接访问 HTML 证书页面。理解这一套配置、排查与渲染体系是 Open edX 平台运维者与课程运营者正确交付课程证书能力的关键。【免费下载链接】openedx-platformThe Open edX LMS Studio, powering education sites around the world!项目地址: https://gitcode.com/GitHub_Trending/ed/openedx-platform创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表