2014-01-28 4 views
72

Я использую Django Rest Framework. и я продолжаю получать сообщение об ошибкеTemplateDoesNotExist - ошибка Django

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 импорта сериализаторов от modules.data.models импорта *

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'), 
) 
+23

У вас есть «rest_framework», указанный в ваших настройках.py INSTALLED_APPS? –

+0

Ошибка noobest. Спасибо за это. –

+0

У меня есть еще одно сомнение. Как мне получить форму в этом, чтобы я опубликовал некоторые данные в форме, попал в БД с этими значениями и получил результат? 'Как я могу получить форму?' –

ответ

186

Убедитесь, что вы rest_framework перечислены в вашем settings.pyINSTALLED_APPS.

+0

Также может быть результатом не регистрации зависимостей DRF. В моем случае мне пришлось добавить '' django_hstore ', 'to' INSTALLED_APPS'. – shacker

5

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

$ pip install --upgrade djangorestframework 
+1

То же самое случилось со мной. Обратите внимание, что команда будет обновлена ​​до, возможно, несовместимой версии (даже если ваш файл setup.py и/или requirements.txt говорит иначе). Вы можете попробовать удалить/установить программу или указать точную версию. –

3

Обратите внимание, что ФПИ пытается вернуть данные в том же формате, который был запрошен. Из вашего браузера это скорее всего HTML. Чтобы указать альтернативный ответ, используйте параметр ?format=. Например: ?format=json.

ошибка TemplateDoesNotExist происходит чаще всего, когда вы посещаете API конечной точки в вашем браузере и вы не имеют rest_framework включенный в список установленных приложений, как описано в других респондентов.

Если у вас нет DRF, включенного в ваш список приложений, но вы не хотите использовать страницу HTML Admin DRF, попробуйте использовать альтернативный формат для «побочного шага» этого сообщения об ошибке.

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

3

Не ваше дело, но и возможная причина настроена 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.

+0

ПРЕДУПРЕЖДЕНИЯ: ?: (1_8.W001) Отдельные настройки TEMPLATE_ * устарели в Django 1.8, а словарь TEMPLATES имеет приоритет. Вы должны поместить значения следующих параметров в ваш TEMPLATES по умолчанию: TEMPLATE_DEBUG. – andi