TemplateDoesNotExist - Error de Django

117

Estoy usando Django Rest Framework. y sigo recibiendo un error

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

No sé cómo me estoy equivocando. Esta es la primera vez que estoy probando el Framework REST. Este es el código.

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)

modelos.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

de django.forms importar widgets de rest_framework importar serializadores de modules.data.models importar *

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'),
)
codificador de python
fuente
34
¿Tiene "rest_framework" en su settings.py INSTALLED_APPS?
Scott Woodall
No es el mejor error. Gracias por eso.
codificador de python
Tengo otra duda. ¿Cómo obtengo un formulario en este para publicar algunos datos en el formulario, presionar la base de datos con esos valores y obtener el resultado? How do I get the form?
codificador de python
@ScottWoodall, por favor, publique la respuesta y obtenga algunos puntos.
Udi

Respuestas:

284

Asegúrese de haber rest_frameworkincluido en su settings.py INSTALLED_APPS.

Scott Woodall
fuente
También podría resultar de no registrar una dependencia de DRF. En mi caso he tenido que añadir 'django_hstore',a INSTALLED_APPS.
shacker
5

Para mí, en rest_framework/api.htmlrealidad faltaba en el sistema de archivos debido a una instalación corrupta o alguna otra razón desconocida. La reinstalación djangorestframeworksolucionó el problema:

$ pip install --upgrade djangorestframework
Jace Browning
fuente
1
A mi me pasó lo mismo. Tenga en cuenta que el comando se actualizará a una versión quizás incompatible (incluso si su setup.py y / o requirements.txt dice lo contrario). Puede intentar desinstalar / instalar pip o especificar la versión exacta.
Jorge Vargas
5

Tenga en cuenta que el DRF intenta devolver datos en el mismo formato que se solicitó. Desde su navegador, lo más probable es que sea HTML. Para especificar una respuesta alternativa, use el ?format=parámetro. Por ejemplo: ?format=json.

El TemplateDoesNotExisterror ocurre con mayor frecuencia cuando está visitando un punto final de API en su navegador y no tiene rest_frameworkincluido en su lista de aplicaciones instaladas, como lo describen otros encuestados.

Si no tiene DRF incluido en su lista de aplicaciones, pero no desea usar la página HTML Admin DRF, intente usar un formato alternativo para "omitir" este mensaje de error.

Más información de los documentos aquí: http://www.django-rest-framework.org/topics/browsable-api/#formats

TheCatParty
fuente
4

No es su caso, pero también es posible razón es personalizado loaderspara Django. Por ejemplo, si tiene en la configuración (desde 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 no va a tratar de ver aplicaciones carpetas con plantillas, ya que debe agregar explícitamente django.template.loaders.app_directories.Loadera loaderspor ello.

Tenga en cuenta que de forma predeterminada se django.template.loaders.app_directories.Loaderincluye en loaders.

prokaktus
fuente
ADVERTENCIAS:?: (1_8.W001) La configuración independiente TEMPLATE_ * quedó obsoleta en Django 1.8 y el diccionario TEMPLATES tiene prioridad. Debe poner los valores de las siguientes configuraciones en su dictado de PLANTILLAS predeterminado: TEMPLATE_DEBUG.
andilabs
0

Me encontré con el mismo mensaje de error. En mi caso, se debió a configurar el backend en Jinja2. En mi archivo de configuración:

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

Cambiar esto de nuevo al valor predeterminado solucionó el problema:

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

Todavía no estoy seguro de si hay una forma de usar el backend de Jinja2 con rest_framework.

calicó_
fuente