TemplateDoesNotExist - Erreur Django

117

J'utilise Django Rest Framework. et je reçois toujours une erreur

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

Je ne sais pas comment je vais mal. C'est la première fois que j'essaye le framework REST. 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

à partir de django.forms importer des widgets à partir de rest_framework importer des sérialiseurs à partir de modules.data.models importer *

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'),
)
codeur python
la source
34
Avez-vous "rest_framework" répertorié dans votre settings.py INSTALLED_APPS?
Scott Woodall
Noobest erreur. Merci pour cela.
python-coder
J'ai un autre doute. Comment puis-je obtenir un formulaire dans celui-ci afin que je publie des données dans le formulaire, frappe la base de données avec ces valeurs et obtienne le résultat? How do I get the form?
python-coder
@ScottWoodall s'il vous plaît postez la réponse et obtenez des points!
Udi

Réponses:

284

Assurez-vous que vous avez rest_frameworkrépertorié dans votre settings.py INSTALLED_APPS.

Scott Woodall
la source
Cela peut également résulter du non-enregistrement d'une dépendance de DRF. Dans mon cas , je devais ajouter 'django_hstore',à INSTALLED_APPS.
shacker
5

Pour moi, rest_framework/api.htmlil manquait en fait le système de fichiers en raison d'une installation corrompue ou d'une autre raison inconnue. La réinstallation a djangorestframeworkrésolu le problème:

$ pip install --upgrade djangorestframework
Jace Browning
la source
1
Il m'est arrivé la même chose. Notez que la commande passera à une version peut-être incompatible (même si votre setup.py et / ou requirements.txt dit le contraire). Vous pouvez essayer de désinstaller / installer pip ou de spécifier la version exacte.
Jorge Vargas
5

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

L' TemplateDoesNotExisterreur se produit le plus souvent lorsque vous visitez un point final de l' API dans votre navigateur et vous ne pas avoir rest_frameworkinclus dans la liste des 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 format alternatif pour `` faire un pas de côté '' de ce message d'erreur.

Plus d'informations sur la documentation ici: http://www.django-rest-framework.org/topics/browsable-api/#formats

TheCatParty
la source
4

Pas votre cas, mais aussi des raisons possibles est personnalisée loaderspour 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 ne tentera pas de regarder des dossiers d' applications avec des modèles, parce que vous devez explicitement ajouter django.template.loaders.app_directories.Loaderen loaderscela.

Notez que, par défaut, django.template.loaders.app_directories.Loaderinclus dans loaders.

prokaktus
la source
AVERTISSEMENTS:?: (1_8.W001) Les paramètres TEMPLATE_ * autonomes étaient obsolètes dans Django 1.8 et le dictionnaire TEMPLATES prévaut. Vous devez mettre les valeurs des paramètres suivants dans votre dict TEMPLATES par défaut: TEMPLATE_DEBUG.
andilabs
0

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

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

Le retour à la valeur par défaut a résolu le problème:

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

Je ne sais toujours pas s'il existe un moyen d'utiliser le backend Jinja2 avec rest_framework.

calicot_
la source