将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:配置并编译翻译文件(有翻译需求时)
- 确保
locale目录结构正确,示例:
my-greeting-extension/locale/ └── en/ └── LC_MESSAGES/ ├── django.po └── django.mo
- 进入容器生成并编译翻译文件:
# 生成翻译模板 docker exec -it <你的容器名称或ID> python manage.py lms makemessages -l en # 编译翻译文件 docker exec -it <你的容器名称或ID> python manage.py lms compilemessages
- 在
custom_settings.py中添加扩展的locale路径:
LOCALE_PATHS += ['/openedx/edx-platform/my-greeting-extension/locale']
三、功能验证
- 获取OAuth2访问令牌:
curl -X POST -u <客户端ID>:<客户端密钥> \ http://<你的LMS域名>/oauth2/token/ \ -d "grant_type=password&username=<测试用户名>&password=<测试密码>"
- 调用API端点:
curl -H "Authorization: Bearer <获取到的访问令牌>" \ -X POST http://<你的LMS域名>/api/greeting/ \ -d "greeting=hello"
- 验证结果:
- 查看LMS日志:
docker logs <你的容器名称或ID>,确认问候语已记录 - 进入Django Admin,查看问候语模型的存储数据
- 检查是否自动触发了传入
goodbye的端点调用
内容的提问来源于stack exchange,提问作者afnan awan
相关产品推荐
相关产品推荐

