TemplateDoesNotExist - Помилка Django


117

Я використовую Django Rest Framework. і я продовжую отримувати помилку

Exception Type: TemplateDoesNotExist
Exception Value: rest_framework/api.html

Я не знаю, як я йду не так. Це перший раз, коли я пробую руки на REST Framework. Це код.

views.py

import socket, json
from modules.data.models import *
from modules.utils import *
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from modules.actions.serializers import ActionSerializer


@api_view(['POST'])
@check_field_exists_wrapper("installation")
def api_actions(request, format = None):

    action_type = request.POST['action_type']
    if action_type == "Shutdown" : 
        send_message = '1'
        print "Shutting Down the system..."
    elif action_type == "Enable" : 
        send_message = '1'
        print "Enabling the system..."
    elif action_type == "Disable" : 
        send_message = '1'
        print "Disabling the system..."
    elif action_type == "Restart" : 
        send_message = '1'
        print "Restarting the system..."

    if action_type in ["Shutdown", "Enable", "Disable"] : PORT = 6000
    else : PORT = 6100

    controllers_list = Controller.objects.filter(installation_id = kwargs['installation_id'])

    for controller_obj in controllers_list:
        ip = controller_obj.ip
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((ip, PORT))
            s.send(send_message)
            s.close()
        except Exception as e:
            print("Exception when sending " + action_type +" command: "+str(e))

    return Response(status = status.HTTP_200_OK)

models.py

class Controller(models.Model):
    id = models.IntegerField(primary_key = True)
    name = models.CharField(max_length = 255, unique = True)
    ip = models.CharField(max_length = 255, unique = True)
    installation_id = models.ForeignKey('Installation')

serializers.py

з django.forms імпортувати віджети з rest_framework імпортувати серіалізатори з module.data.models import *

class ActionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Controller
        fields = ('id', 'name', 'ip', 'installation_id')

urls.py

from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns

urlpatterns = patterns('modules.actions.views',
    url(r'^$','api_actions',name='api_actions'),
)

34
Чи є у ваших налаштуваннях "rest_framework". INSTALLED_APPS?
Скотт Вуддолл

Необоснована помилка. Дякую за це.
пітон-кодер

У мене є ще одна сумнів. Як отримати форму в цьому, щоб я розміщував деякі дані у формі, потрапляв у БД із тими значеннями та отримував результат? How do I get the form?
пітон-кодер

@ScottWoodall, будь ласка, опублікуйте відповідь та отримайте кілька балів!
Уді

Відповіді:


284

Переконайтеся, що ви rest_frameworkвказали у своєму settings.py INSTALLED_APPS.


Також може бути результатом нереєстрації залежності ДРФ. У моєму випадку я повинен був додати 'django_hstore',до INSTALLED_APPS.
шейкер

5

Для мене rest_framework/api.htmlнасправді відсутня у файловій системі через пошкоджену установку чи іншу невідому причину. Перевстановлення усунула djangorestframeworkпроблему:

$ pip install --upgrade djangorestframework

1
Зі мною трапилось те саме. Зауважте, що команда буде оновлена ​​до можливо несумісної версії (навіть якщо ваш setup.py та / або вимоги.txt говорить інше). Ви можете спробувати видалити / встановити піп або вказати точну версію.
Хорхе Варгас

5

Зверніть увагу, що DRF намагається повернути дані у тому ж форматі, що і запитували. З вашого браузера це, швидше за все, HTML. Щоб вказати альтернативну відповідь, використовуйте ?format=параметр. Наприклад: ?format=json.

TemplateDoesNotExistПомилка відбувається найчастіше , коли ви відвідуєте API кінцеву точку в вашому браузері , і ви НЕ маєте rest_frameworkвключені в списку встановлених додатків, як описано в інших респондентів.

Якщо у списку програм у вас немає DRF, але ви не хочете використовувати сторінку DRF з HTML-адміністратором, спробуйте скористатися альтернативним форматом, щоб "побічний крок" цього повідомлення про помилку.

Більше інформації про документи тут: http://www.django-rest-framework.org/topics/browsable-api/#formats


4

Не ваша справа, але і можлива причина налаштована loadersдля Django. Наприклад, якщо у вас є налаштування (з тих пір Django 1.8):

TEMPLATES = [
{
    ...
    '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'
        ],
        'loaders': [
            'django.template.loaders.filesystem.Loader',
        ],
        ...
    }
}]

Django не намагатиметься дивитися на додатки папки з шаблонами, тому що ви повинні явно додати django.template.loaders.app_directories.Loaderв loadersдля цього.

Зауважте, що за замовчуванням django.template.loaders.app_directories.Loaderвключено в loaders.


ПОПЕРЕДЖЕННЯ:?: (1_8.W001) У Django 1.8 було вимкнено окремі налаштування TEMPLATE_ *, а словник TEMPLATES має перевагу. Ви повинні ввести значення наступних налаштувань у дерикт TEMPLATES за замовчуванням: TEMPLATE_DEBUG.
andilabs

0

Я наткнувся на те саме повідомлення про помилку. У моєму випадку це було пов’язано із встановленням резервного файлу на Jinja2. У моєму файлі налаштувань:

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.jinja2.Jinja2',
...

Зміна цього повернення до типового завдання вирішила проблему:

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
...

Все ще не впевнений, чи є спосіб використовувати сервер Jinja2 з rest_framework.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.