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'),
)
Assurez-vous que vous avez rest_framework
énumérés dans votre settings.py
INSTALLED_APPS
.
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
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
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
.
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.