调用第三方API后Django无法找到base.html模板的问题排查
问题原因与解决方案
我之前也碰到过类似第三方SDK干扰Django运行环境的问题,你的情况大概率是Zoho的ZCRMRestClient在初始化过程中修改了当前工作目录(CWD),导致Django后续渲染模板时,错误地以pickle目录为基准查找base.html。
为什么会出现这个问题?
Django默认基于当前工作目录解析模板路径,而Zoho的ZCRMRestClient在处理token_persistence_path配置时,可能会自动切换工作目录到该路径下。当你调用ZCRMRestClient.initialize(config)后,当前工作目录已经变成了/webapp/camera_search/api/pickle/,所以Django渲染siren_search.html时,会从这个目录出发找base.html,自然找不到正确路径下的模板文件。
你可以先验证这个猜想:在调用初始化前后打印当前工作目录:
import os def search_by_jobsite(jobsite): print("初始化前工作目录:", os.getcwd()) # 应该是项目根目录/webapp/ config = settings.ZOHO_CONFIG client = ZCRMRestClient.initialize(config) print("初始化后工作目录:", os.getcwd()) # 会变成pickle目录 # ... 后续代码
解决方法
方法1:保存并恢复原工作目录(最稳妥)
在调用SDK初始化前后,手动保存原工作目录,操作完成后强制恢复,确保Django后续运行环境不受影响:
import os from django.conf import settings from zcrmsdk import ZCRMRestClient, ZCRMModule def search_by_jobsite(jobsite): # 保存初始工作目录 original_cwd = os.getcwd() config = settings.ZOHO_CONFIG try: client = ZCRMRestClient.initialize(config) all_cameras = ZCRMModule.get_instance('Vendors').search_records(f'{jobsite}') deployed_cameras = {} # ... 你的数据处理逻辑 return deployed_cameras finally: # 无论成功/失败,都恢复原工作目录 os.chdir(original_cwd)
用finally块保证即使SDK调用出错,也不会让工作目录停留在错误路径。
方法2:确保Django模板目录使用绝对路径
同时,你可以修改settings.py中的模板配置,用绝对路径定义模板目录,进一步避免路径解析问题:
import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], # 绝对路径 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
这样即使工作目录被修改,Django也能通过绝对路径直接找到base.html所在的模板目录。
内容的提问来源于stack exchange,提问作者Hunter
相关产品推荐
相关产品推荐

