You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将Django REST API扩展集成至Open edX容器的技术指导请求

集成自定义Django扩展到基于Tutor的Open edX容器并解决翻译错误

一、扩展集成步骤

1. 整理扩展目录结构

确保你的Django扩展符合标准结构,示例:

my-greeting-extension/
├── __init__.py
├── apps.py
├── models.py       # 定义问候语存储模型
├── views.py        # 实现API端点逻辑(日志记录、数据库存储、OAuth2调用)
├── urls.py         # 配置API路由
└── locale/         # 空目录(用于处理翻译,无需求可保留)

2. 挂载扩展到容器

启动Open edX容器时,通过bind mount将本地扩展目录挂载到容器内的edX平台目录:

docker run -d \
  # 其他原有启动参数...
  -v /本地绝对路径/my-greeting-extension:/openedx/edx-platform/my-greeting-extension \
  gallery.ecr.aws/ibleducation/ibl-edx-ce

3. 配置Django设置

创建自定义设置文件custom_settings.py,将扩展加入INSTALLED_APPS并配置OAuth2认证:

# custom_settings.py
INSTALLED_APPS += ['my-greeting-extension']

# 复用Open edX原生OAuth2认证配置
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
        'rest_framework.authentication.SessionAuthentication',
    ],
}

将该文件挂载到Tutor默认的自定义设置路径:

docker run -d \
  # 其他原有启动参数...
  -v /本地绝对路径/custom_settings.py:/openedx/edx-platform/lms/envs/tutor/custom.py \
  gallery.ecr.aws/ibleducation/ibl-edx-ce

4. 配置API路由

将扩展的路由添加到LMS总路由。可直接在容器内执行命令修改:

docker exec -it <你的容器名称或ID> \
  bash -c "echo \"url(r'^api/greeting/', include('my-greeting-extension.urls')),\" >> /openedx/edx-platform/lms/urls.py"

或者提前修改本地的lms/urls.py副本,再挂载替换容器内的对应文件。

5. 创建OAuth2客户端

进入Django Admin(路径:/admin),在OAuth2 Provider > Applications下创建新客户端:

  • 客户端类型:Confidential
  • 授权类型:勾选Resource owner password-based和Authorization code
  • 回调URL:填写测试用地址(如http://localhost:8000/callback)
    记录生成的客户端ID和客户端密钥,用于扩展内的OAuth2调用。

6. 执行数据库迁移

进入容器执行迁移,创建问候语对应的数据库表:

docker exec -it <你的容器名称或ID> python manage.py lms migrate my-greeting-extension

7. 重启容器

让所有配置生效:

docker restart <你的容器名称或ID>

二、解决「翻译文件未找到」错误

方案1:禁用扩展翻译(无翻译需求时)

修改扩展的apps.py,添加use_i18n=False禁用翻译功能:

from django.apps import AppConfig

class MyGreetingExtensionConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'my-greeting-extension'
    use_i18n = False  # 禁用翻译,避免查找翻译文件

方案2:配置并编译翻译文件(有翻译需求时)

  1. 确保locale目录结构正确,示例:
my-greeting-extension/locale/
└── en/
    └── LC_MESSAGES/
        ├── django.po
        └── django.mo
  1. 进入容器生成并编译翻译文件:
# 生成翻译模板
docker exec -it <你的容器名称或ID> python manage.py lms makemessages -l en
# 编译翻译文件
docker exec -it <你的容器名称或ID> python manage.py lms compilemessages
  1. 在custom_settings.py中添加扩展的locale路径:
LOCALE_PATHS += ['/openedx/edx-platform/my-greeting-extension/locale']

三、功能验证

  1. 获取OAuth2访问令牌:
curl -X POST -u <客户端ID>:<客户端密钥> \
  http://<你的LMS域名>/oauth2/token/ \
  -d "grant_type=password&username=<测试用户名>&password=<测试密码>"
  1. 调用API端点:
curl -H "Authorization: Bearer <获取到的访问令牌>" \
  -X POST http://<你的LMS域名>/api/greeting/ \
  -d "greeting=hello"
  1. 验证结果:
  • 查看LMS日志:docker logs <你的容器名称或ID>,确认问候语已记录
  • 进入Django Admin,查看问候语模型的存储数据
  • 检查是否自动触发了传入goodbye的端点调用

内容的提问来源于stack exchange,提问作者afnan awan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 13:30:34