TemplateDoesNotExist - Erro Django

116

Estou usando o Django Rest Framework. e continuo recebendo um erro

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

Não sei como estou errando. Esta é a primeira vez que estou testando o REST Framework. Isso é 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)

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

from django.forms importe widgets de rest_framework import serializers from modules.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'),
)
codificador python
fonte
34
Você tem "rest_framework" listado em settings.py INSTALLED_APPS?
Scott Woodall
Erro mais nobre. Obrigado por isso.
python-coder
Tenho outra dúvida. Como faço para obter um formulário neste para que poste alguns dados no formulário, acerte o DB com esses valores e obtenha o resultado? How do I get the form?
python-coder
@ScottWoodall poste a resposta e ganhe alguns pontos!
Udi

Respostas:

283

Certifique-se de ter rest_frameworklistado em seu settings.py INSTALLED_APPS.

Scott Woodall
fonte
Também pode resultar do não registro de uma dependência do DRF. No meu caso eu tive que adicionar 'django_hstore',a INSTALLED_APPS.
shacker de
5

Para mim, rest_framework/api.htmlestava faltando no sistema de arquivos devido a uma instalação corrompida ou algum outro motivo desconhecido. A reinstalação djangorestframeworkresolveu o problema:

$ pip install --upgrade djangorestframework
Jace Browning
fonte
1
A mesma coisa aconteceu comigo. Observe que o comando será atualizado para uma versão talvez incompatível (mesmo se seu setup.py e / ou requirements.txt disser o contrário). Você pode tentar desinstalar / instalar pip ou especificar a versão exata.
Jorge Vargas
5

Observe que o DRF tenta retornar dados no mesmo formato que foi solicitado. Em seu navegador, é mais provável que seja HTML. Para especificar uma resposta alternativa, use o ?format=parâmetro. Por exemplo: ?format=json.

O TemplateDoesNotExisterro ocorre mais comumente quando você está visitando um endpoint de API em seu navegador e não tem o rest_frameworkincluído em sua lista de aplicativos instalados, conforme descrito por outros entrevistados.

Se você não tiver o DRF incluído em sua lista de aplicativos, mas não quiser usar a página HTML Admin DRF, tente usar um formato alternativo para evitar essa mensagem de erro.

Mais informações da documentação aqui: http://www.django-rest-framework.org/topics/browsable-api/#formats

TheCatParty
fonte
4

Não é o seu caso, mas também o motivo possível é personalizado loaderspara Django. Por exemplo, se você tiver nas configurações (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 não vai tentar olhar pastas aplicações com modelos, porque você deve adicionar explicitamente django.template.loaders.app_directories.Loaderem loaderspara isso.

Observe que, por padrão, django.template.loaders.app_directories.Loaderincluído em loaders.

Prokaktus
fonte
AVISOS:?: (1_8.W001) As configurações TEMPLATE_ * independentes foram descontinuadas no Django 1.8 e o dicionário TEMPLATES tem precedência. Você deve colocar os valores das seguintes configurações em seu dict padrão TEMPLATES: TEMPLATE_DEBUG.
andilabs
0

Encontrei a mesma mensagem de erro. No meu caso, foi devido à configuração do back-end para Jinja2. No meu arquivo de configurações:

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

Alterar de volta para o padrão corrigiu o problema:

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

Ainda não tenho certeza se existe uma maneira de usar o backend Jinja2 com rest_framework.

chita_
fonte