web-dev-qa-db-de.com

TemplateDoesNotExist - Django Error

Ich verwende Django Rest Framework. Und es wird immer wieder eine Fehlermeldung angezeigt

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

Ich weiß nicht, wie ich mich irre. Dies ist das erste Mal, dass ich REST Framework ausprobiere. Dies 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 importieren Serializer aus modules.data.models importieren *

class ActionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Controller
        fields = ('id', 'name', 'ip', 'installation_id')

rls.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'),
)
110
python-coder

Stell sicher dass du hast rest_framework aufgeführt in Ihrem settings.pyINSTALLED_APPS.

267
Scott Woodall

Für mich, rest_framework/api.html fehlte tatsächlich auf dem Dateisystem aufgrund einer beschädigten Installation oder eines anderen unbekannten Grundes. Neuinstallation von djangorestframework hat das Problem behoben:

$ pip install --upgrade djangorestframework
5
Jace Browning

Bitte beachten Sie, dass das DRF versucht, Daten im gleichen Format wie angefordert zurückzugeben. In Ihrem Browser ist dies höchstwahrscheinlich HTML. Um eine alternative Antwort anzugeben, verwenden Sie das ?format= Parameter. Beispielsweise: ?format=json.

Der Fehler TemplateDoesNotExist tritt am häufigsten auf, wenn Sie einen API-Endpunkt in Ihrem Browser besuchen und nicht über das rest_framework in der Liste der installierten Apps enthalten, wie von anderen Befragten beschrieben.

Wenn Sie DRF nicht in Ihre Liste der Apps aufgenommen haben, aber die HTML-Admin-DRF-Seite nicht verwenden möchten, verwenden Sie ein alternatives Format, um diese Fehlermeldung zu umgehen.

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

4
TheCatParty

Nicht Ihr Fall, sondern auch möglicher Grund ist loaders für Django angepasst. Zum Beispiel, wenn Sie in Einstellungen haben (seit 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 wird nicht versuchen, Anwendungsordner mit Vorlagen zu betrachten, da Sie hierfür explizit Django.template.loaders.app_directories.Loader In loaders einfügen sollten.

Beachten Sie, dass standardmäßig Django.template.loaders.app_directories.Loader In loaders enthalten ist.

3
prokaktus

Ich bin auf dieselbe 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 die Standardeinstellung 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.

0
calico_