Django больше не может найти base.html после вызова API третьего уровня - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь вызвать сторонний API в моем приложении Django, точнее в views.py. Как только я позвоню, Джанго не сможет найти шаблон base.html.

По сути это то, что происходит:

  1. пользователь ищет термин в форме поиска
  2. запрос отправлен на мой взгляд
  3. представление имеет оператор if для обработки, когда пользователь делает запрос GET, поэтому этот фрагмент логики обрабатывает запрос
  4. представление выполняет вызов отдельной функции search_by_jobsite(), написанной мной
  5. внутри search_by_jobsite(), выполняется вызов стороннего API, и я передаю местоположение файла .pkl в API. Расположение /webapp/camera_search/api/pickle/config.pkl.
  6. Все в порядке и search_by_jobsite() извлекает необходимую информацию
  7. Возвращает информацию обратно в представление, и представление продолжает определять контекстный словарь и пытается 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 :

  1. Начинается с /webapp/camera_search/views.py и выполняет сторонний вызов API
  2. Во время вызова API, django перемещается на /webapp/camera_search/api/pickle/
  3. Возвращается к просмотру /webapp/camera_search/views.py
  4. Пытается отрендерить siren_search.html и находит его в правильном месте /webapp/camera_search/templates/siren_search.html
  5. Пытается расширить 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'
}
...