TemplateDoesNotExist - Errore Django


117

Sto usando Django Rest Framework. e continuo a ricevere un errore

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

Non so come sto sbagliando. Questa è la prima volta che provo le mani su REST Framework. Questo è il codice.

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

da django.forms importa widget da rest_framework importa serializzatori da 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'),
)

34
Hai "rest_framework" elencato nelle tue impostazioni.py INSTALLED_APPS?
Scott Woodall,

Noobest errore. Grazie per questo.
Python-coder

Ho un altro dubbio. Come ottengo un modulo in questo in modo da inserire alcuni dati nel modulo, premere il DB con quei valori e ottenere il risultato? How do I get the form?
Python-coder

@ScottWoodall per favore pubblica la risposta e ottieni alcuni punti!
Udi

Risposte:


284

Assicurati di aver rest_frameworkelencato nel tuo file settings.py INSTALLED_APPS.


Potrebbe anche derivare dalla mancata registrazione di una dipendenza di DRF. Nel mio caso ho dovuto aggiungere 'django_hstore',a INSTALLED_APPS.
shacker

5

Per me, rest_framework/api.htmlmancava effettivamente sul filesystem a causa di un'installazione corrotta o per qualche altro motivo sconosciuto. La reinstallazione ha djangorestframeworkrisolto il problema:

$ pip install --upgrade djangorestframework

1
La stessa cosa è successa a me. Nota che il comando verrà aggiornato a una versione forse incompatibile (anche se il tuo setup.py e / o requirements.txt dice diversamente). Puoi provare a disinstallare / installare pip o specificare la versione esatta.
Jorge Vargas

5

Si noti che il DRF tenta di restituire i dati nello stesso formato richiesto. Dal tuo browser, questo è molto probabilmente HTML. Per specificare una risposta alternativa, utilizzare il ?format=parametro. Ad esempio: ?format=json.

L' TemplateDoesNotExisterrore si verifica più comunemente quando si visita un endpoint API nel browser e non è rest_frameworkincluso nell'elenco delle app installate, come descritto da altri intervistati.

Se non hai DRF incluso nel tuo elenco di app, ma non desideri utilizzare la pagina HTML Admin DRF, prova a utilizzare un formato alternativo al "passaggio laterale" di questo messaggio di errore.

Maggiori informazioni dai documenti qui: http://www.django-rest-framework.org/topics/browsable-api/#formats


4

Non è il tuo caso, ma anche la possibile ragione è personalizzata loadersper Django. Ad esempio, se hai nelle impostazioni (da 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 non provare a guardare le applicazioni cartelle con i modelli, perché si dovrebbe esplicitamente aggiungere django.template.loaders.app_directories.Loaderin loadersper questo.

Si noti che per impostazione predefinita è django.template.loaders.app_directories.Loaderincluso in loaders.


AVVERTENZE:?: (1_8.W001) Le impostazioni autonome di TEMPLATE_ * sono state deprecate in Django 1.8 e il dizionario TEMPLATES ha la precedenza. È necessario inserire i valori delle seguenti impostazioni nel dict TEMPLATES predefinito: TEMPLATE_DEBUG.
andilabs

0

Mi sono imbattuto nello stesso messaggio di errore. Nel mio caso, era dovuto all'impostazione del backend su Jinja2. Nel mio file delle impostazioni:

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

La modifica di questo valore predefinito ha risolto il problema:

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

Non sono ancora sicuro che ci sia un modo per utilizzare il backend Jinja2 con rest_framework.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.