TemplateDoesNotExist - Django-Fehler

116

Ich benutze Django Rest Framework. und ich bekomme immer wieder einen Fehler

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

Ich weiß nicht, wie ich falsch liege. Dies ist das erste Mal, dass ich REST Framework ausprobiere. Das ist Code.

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

aus django.forms importieren Widgets aus rest_framework Serializer aus modules.data.models importieren 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'),
)
Python-Codierer
quelle
34
Haben Sie "rest_framework" in Ihrer settings.py INSTALLED_APPS aufgeführt?
Scott Woodall
Noobest Fehler. Danke dafür.
Python-Codierer
Ich habe noch einen Zweifel. Wie erhalte ich ein Formular in diesem Formular, damit ich einige Daten im Formular poste, die Datenbank mit diesen Werten erreiche und das Ergebnis erhalte? How do I get the form?
Python-Codierer
@ScottWoodall bitte poste die Antwort und hol dir ein paar Punkte!
Udi

Antworten:

283

Stellen Sie sicher, dass Sie rest_frameworkin Ihrem aufgeführt sind settings.py INSTALLED_APPS.

Scott Woodall
quelle
Könnte auch darauf zurückzuführen sein, dass keine DRF-Abhängigkeit registriert wurde. In meinem Fall hatte ich hinzufügen 'django_hstore',zu INSTALLED_APPS.
Shacker
5

Für mich rest_framework/api.htmlfehlte tatsächlich im Dateisystem aufgrund einer beschädigten Installation oder eines anderen unbekannten Grundes. Durch die Neuinstallation wurde djangorestframeworkdas Problem behoben:

$ pip install --upgrade djangorestframework
Jace Browning
quelle
1
Das gleiche ist mir passiert. Beachten Sie, dass der Befehl auf eine möglicherweise nicht kompatible Version aktualisiert wird (auch wenn in setup.py und / oder require.txt etwas anderes angegeben ist). Sie können versuchen, pip zu deinstallieren / installieren oder die genaue Version angeben.
Jorge Vargas
5

Bitte beachten Sie, dass der DRF versucht, Daten in demselben Format zurückzugeben, das angefordert wurde. In Ihrem Browser ist dies höchstwahrscheinlich HTML. Verwenden Sie den ?format=Parameter, um eine alternative Antwort anzugeben . Zum Beispiel : ?format=json.

Der TemplateDoesNotExistFehler tritt am häufigsten auf, wenn Sie einen API - Endpunkt in Ihrem Browser besuchen , und Sie nicht haben die rest_frameworkin der Liste der installierten Anwendungen enthalten, wie sie von anderen Befragten beschrieben.

Wenn Sie DRF nicht in Ihrer Liste der Apps enthalten haben, aber die DRF-Seite für HTML-Administratoren nicht verwenden möchten, versuchen Sie, ein alternatives Format zu verwenden, um diese Fehlermeldung zu umgehen.

Weitere Informationen aus den Dokumenten finden Sie hier: http://www.django-rest-framework.org/topics/browsable-api/#formats

TheCatParty
quelle
4

Nicht Ihr Fall, sondern auch möglicher Grund ist angepasst loadersfür Django. Zum Beispiel, wenn Sie in Einstellungen (seit Django 1.8) haben:

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 wird versuchen , nicht auf Anwendungen Ordner mit Vorlagen zu suchen, weil Sie explizit hinzufügen sollten django.template.loaders.app_directories.Loaderin loadersdafür.

Beachten Sie, dass standardmäßig in django.template.loaders.app_directories.Loaderenthalten loaders.

prokaktus
quelle
WARNHINWEISE:?: (1_8.W001) Die eigenständigen TEMPLATE_ * -Einstellungen wurden in Django 1.8 nicht mehr unterstützt und das TEMPLATES-Wörterbuch hat Vorrang. Sie müssen die Werte der folgenden Einstellungen in Ihr Standard-TEMPLATES-Diktat einfügen: TEMPLATE_DEBUG.
Andilabs
0

Ich bin auf die gleiche Fehlermeldung gestoßen. In meinem Fall lag es daran, das Backend auf Jinja2 zu setzen. In meiner Einstellungsdatei:

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

Das Zurücksetzen auf den Standardwert behebt das Problem:

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

Ich bin mir immer noch nicht sicher, ob es eine Möglichkeit gibt, das Jinja2-Backend mit rest_framework zu verwenden.

Kattun_
quelle