Reputation: 2148
I'm using Django Rest Framework. and I keep getting an error
Exception Type: TemplateDoesNotExist
Exception Value: rest_framework/api.html
I dont know how I'm going wrong. This is the first time I'm trying out hands on REST Framework. This is 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
from django.forms import widgets from rest_framework import serializers from modules.data.models import *
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'),
)
Upvotes: 121
Views: 37124
Reputation: 1
We can get the error even if we missed adding the 'rest_framework' in the installed apps. So please check that too if you are facing the error.
Upvotes: 0
Reputation: 1221
I ran into the same error message. In my case, it was due to setting the backend to Jinja2. In my settings file:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
...
Changing this back to the default fixed the problem:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
...
Still not sure if there is a way to use the Jinja2 backend with rest_framework.
Upvotes: 0
Reputation: 632
Not your case, but also possible reason is customized loaders
for Django
. For example, if you have in settings (since 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 will not try to look at applications folders with templates, because you should explicitly add django.template.loaders.app_directories.Loader
into loaders
for that.
Notice, that by default django.template.loaders.app_directories.Loader
included into loaders
.
Upvotes: 4
Reputation: 1579
Please note that the DRF attempts to return data in the same format that was requested. From your browser, this is most likely HTML. To specify an alternative response, use the ?format=
parameter. For example: ?format=json
.
The TemplateDoesNotExist
error occurs most commonly when you are visiting an API endpoint in your browser and you do not have the rest_framework
included in your list of installed apps, as described by other respondents.
If you do not have DRF included in your list of apps, but don't want to use the HTML Admin DRF page, try using an alternative format to 'side-step' this error message.
More info from the docs here: http://www.django-rest-framework.org/topics/browsable-api/#formats
Upvotes: 6
Reputation: 12672
For me, rest_framework/api.html
was actually missing on the filesystem due to a corrupt installation or some other unknown reason. Reinstalling djangorestframework
fixed the problem:
$ pip install --upgrade djangorestframework
Upvotes: 5
Reputation: 10676
Make sure you have rest_framework
listed in your settings.py
INSTALLED_APPS
.
Upvotes: 299