web-dev-qa-db-fra.com

TemplateDoesNotExist - Django Erreur

J'utilise Django Rest Framework.) Et je continue à avoir une erreur

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

Je ne sais pas comment je me trompe. C’est la première fois que j’essaie de travailler sur REST Framework. C’est du 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

depuis Django.forms, widgets d'importation depuis rest_framework, importateurs sérialiseurs depuis modules.data.models, import *

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

Assurez-vous que vous avez rest_framework énumérés dans votre settings.pyINSTALLED_APPS.

267
Scott Woodall

Pour moi, rest_framework/api.html était en fait absent du système de fichiers en raison d'une installation corrompue ou d'une autre raison inconnue. La réinstallation de djangorestframework a résolu le problème:

$ pip install --upgrade djangorestframework
5
Jace Browning

Veuillez noter que le DRF tente de renvoyer des données dans le même format que celui demandé. Depuis votre navigateur, il s’agit probablement du code HTML. Pour spécifier une réponse alternative, utilisez la commande ?format= paramètre. Par exemple: ?format=json.

L’erreur TemplateDoesNotExist se produit généralement lorsque vous visitez un noeud final d’API dans votre navigateur et que vous n’avez pas le rest_framework inclus dans votre liste d'applications installées, comme décrit par d'autres répondants.

Si DRF n'est pas inclus dans votre liste d'applications, mais que vous ne souhaitez pas utiliser la page HTML Admin DRF, essayez d'utiliser un autre format pour "masquer" ce message d'erreur.

Plus d'informations sur les documents ici: http://www.Django-rest-framework.org/topics/browsable-api/#formats

4
TheCatParty

Ce n'est pas votre cas, mais la raison possible est personnalisée loaders pour Django. Par exemple, si vous avez dans les paramètres (depuis 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'essaiera pas d'examiner les dossiers d'applications avec des modèles, car vous devez explicitement ajouter Django.template.loaders.app_directories.Loader dans loaders pour cela.

Notez que par défaut Django.template.loaders.app_directories.Loader inclus dans loaders.

3
prokaktus

J'ai rencontré le même message d'erreur. Dans mon cas, cela était dû à la définition du backend sur Jinja2. Dans mon fichier de paramètres:

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

Remettre cette valeur par défaut corrigeait le problème:

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

Vous ne savez toujours pas s’il est possible d’utiliser le backend Jinja2 avec rest_framework.

0
calico_