2014-01-28 6 views
72

Ich verwende Django Ruhe Framework. und ich bekomme immer einen FehlerTemplateDoesNotExist - Django Fehler

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

Ich weiß nicht, wie ich falsch liege. Dies ist das erste Mal, dass ich Hands on 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 import Serialisierer 012.von modules.data.models importieren *

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'), 
) 
+23

Haben Sie INSTALLED_APPS "rest_framework" aufgeführt in Ihrem settings.py haben? –

+0

Noobest Fehler. Danke dafür. –

+0

Ich habe noch einen Zweifel. Wie bekomme ich ein Formular in diesem Formular, damit ich einige Daten im Formular posten kann, die DB mit diesen Werten anstoße und das Ergebnis bekomme? 'Wie bekomme ich das Formular?' –

Antwort

186

Stellen Sie sicher, rest_framework in Ihrem settings.pyINSTALLED_APPS aufgeführt haben.

+0

Könnte auch dazu führen, dass keine Abhängigkeit von DRF registriert wird. In meinem Fall musste ich '' django_hstore ''zu' INSTALLED_APPS' hinzufügen. – shacker

5

Für mich rest_framework/api.html wurde auf dem Dateisystem tatsächlich fehlt aufgrund einer beschädigten Installation oder einem anderen unbekannten Gründen. Neuinstallieren djangorestframework das Problem behoben:

$ pip install --upgrade djangorestframework 
+1

Das Gleiche ist mir passiert. Beachten Sie, dass der Befehl auf eine möglicherweise inkompatible Version aktualisiert wird (auch wenn Ihre setup.py und/oder requirements.txt das Gegenteil sagt). Sie können versuchen, pip deinstallieren/installieren oder die genaue Version angeben. –

3

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

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

Wenn DRF nicht in Ihrer App-Liste enthalten ist, Sie aber nicht die HTML-Admin-DRF-Seite verwenden möchten, versuchen Sie es mit einem alternativen Format, um diese Fehlermeldung zu umgehen.

Weitere Daten aus der Dokumentation hier: http://www.django-rest-framework.org/topics/browsable-api/#formats

3

Nicht Ihr Fall, aber auch Grund angepasst sind loaders für Django. Zum Beispiel, wenn Sie in den 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, auf Anwendungen Ordner mit Vorlagen zu suchen, weil Sie explizit django.template.loaders.app_directories.Loader in loaders für das hinzufügen soll.

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

+0

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 Ihre Standardvorlage TEMPLATE dict: TEMPLATE_DEBUG eingeben. – andi