Я пытаюсь вызвать сторонний API в моем приложении Django, точнее в views.py
. Как только я позвоню, Джанго не сможет найти шаблон base.html
.
По сути это то, что происходит:
- пользователь ищет термин в форме поиска
- запрос отправлен на мой взгляд
- представление имеет оператор if для обработки, когда пользователь делает запрос GET, поэтому этот фрагмент логики обрабатывает запрос
- представление выполняет вызов отдельной функции
search_by_jobsite()
, написанной мной
- внутри
search_by_jobsite()
, выполняется вызов стороннего API, и я передаю местоположение файла .pkl
в API. Расположение /webapp/camera_search/api/pickle/config.pkl
.
- Все в порядке и
search_by_jobsite()
извлекает необходимую информацию
- Возвращает информацию обратно в представление, и представление продолжает определять контекстный словарь и пытается
render(request, 'siren_search.html', context)
. Тем не менее, это где это не удается.
Первая строка в siren_search.html
- это {% extends 'base.html' %}
, поэтому он начинает искать base.html
, но ищет в неправильном каталоге. Поиск base.html
в /webapp/camera_search/api/pickle/
, когда base.html
находится в /webapp/webapp/templates/base.html
. По какой-то причине, когда django переходит в папку pickle/
для отправки информации стороннему API, он также начинает поиск base.html
, но может найти siren_search.html
просто найти.
Резюме того, что делает django :
- Начинается с
/webapp/camera_search/views.py
и выполняет сторонний вызов API
- Во время вызова API, django перемещается на
/webapp/camera_search/api/pickle/
- Возвращается к просмотру
/webapp/camera_search/views.py
- Пытается отрендерить
siren_search.html
и находит его в правильном месте /webapp/camera_search/templates/siren_search.html
- Пытается расширить
base.html
и искать в /webapp/camera_search/api/pickle/
, но на самом деле он находится в /webapp/webapp/templates/base.html
.
Вот ссылка на полный трекбек: http://dpaste.com/3ZTBJAG
У меня вопрос: что происходит и как мне перенаправить Django обратно в соответствующие каталоги?
EDIT
Вот мои настройки ШАБЛОНОВ и мой соответствующий код от views.py
.
# /webapp/webapp/settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': ['webapp/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',
],
},
},
]
# /webapp/camera_search/views.py
from .models import CameraSystem, JobSite
from django.core.exceptions import ObjectDoesNotExist
from django.shortcuts import render, redirect
from django.conf import settings
from zcrmsdk import ZCRMRecord, ZCRMRestClient, ZCRMModule
def siren_search(request):
term = request.GET.get('query', '')
context = {}
#
# ...
#
# Handle when the user presses enter
elif 'query' in request.GET and term != '' and not request.is_ajax():
try:
deployed = search_by_jobsite('JOBSITE') # --- This is what i'm attempting to do. Currently the search works using the below functionality, but i'm trying to integrate this third party API call.
jobsite = JobSite.objects.get(name__iexact=term)
cameras = jobsite.camerasystem_set.all()
context = {
'cameras': cameras,
}
except ObjectDoesNotExist:
context = {}
pass
return render(request, 'siren_search.html', context) # Django fails here
def search_by_jobsite(jobsite):
# config is a dictionary with API authentication settings.
config = settings.ZOHO_CONFIG
client = ZCRMRestClient.initialize(config)
all_cameras = ZCRMModule.get_instance('Vendors').search_records(f'{jobsite}')
deployed_cameras = {}
# ... process data
return deployed_cameras
Вот пример словаря конфигурации, который я передаю клиенту API.
config = {
'sandbox': 'False',
'applicationLogFilePath': '/Users/user/Programming/suitee/webapp/camera_search/api/log/',
'client_id': 'xxxx.xxxxxxxxxxxxx',
'client_secret': 'xxxxxxxxxxxxxxxxxxxxxxxxx',
'redirect_uri': 'http://localhost:8000/',
'accounts_url': 'https://accounts.zoho.com',
'token_persistence_path': '/Users/user/Programming/suite/webapp/camera_search/api/pickle/',
'currentUserEmail': 'email@domain.com'
}