Я использую Django Rest Framework. и я продолжаю получать сообщение об ошибке
Exception Type: TemplateDoesNotExist
Exception Value: rest_framework/api.html
Я не знаю, как я ошибаюсь. Это первый раз, когда я пытаюсь разобраться с REST Framework. Это код.
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
из виджетов импорта django.forms из сериализаторов импорта rest_framework из импорта modules.data.models *
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'),
)
Убедитесь, что у вас есть rest_framework
, указанный в вашем settings.py
INSTALLED_APPS
.
'django_hstore',
в INSTALLED_APPS
.
Для меня rest_framework/api.html
фактически отсутствовал в файловой системе из-за коррумпированной установки или какой-либо другой неизвестной причины. При переустановке djangorestframework
исправлена проблема:
$ pip install --upgrade djangorestframework
Не ваше дело, но и возможная причина настраивается loaders
для Django
. Например, если у вас есть настройки (с 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 не будет пытаться искать папки приложений с шаблонами, потому что для этого нужно явно добавить django.template.loaders.app_directories.Loader
в loaders
.
Обратите внимание, что по умолчанию django.template.loaders.app_directories.Loader
включен в loaders
.
Обратите внимание, что DRF пытается вернуть данные в том же формате, который был запрошен. Из вашего браузера это скорее всего HTML. Чтобы указать альтернативный ответ, используйте параметр ?format=
. Например: ?format=json
.
Ошибка TemplateDoesNotExist
возникает чаще всего при посещении конечной точки API в вашем браузере, и у вас нет rest_framework
, включенного в список установленных приложений, как описано другими респондентами.
Если у вас нет DRF, включенного в ваш список приложений, но вы не хотите использовать страницу HTML Admin DRF, попробуйте использовать альтернативный формат для "побочного шага" этого сообщения об ошибке.
Дополнительная информация из документации: http://www.django-rest-framework.org/topics/browsable-api/#formats
Иногда в вашем проекте нет rest_framework
Установите rest-framework: pip install djangorestframework
и pip install djangorestframework
остальные фреймворки в setting.py: INSTALLED_APPS = [
'rest_framework',
]
Я столкнулся с тем же сообщением об ошибке. В моем случае это было связано с настройкой бэкэнда для Jinja2. В моем файле настроек:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
...
Изменение этого значения по умолчанию устранило проблему:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
...
Все еще не уверен, есть ли способ использовать бэкэнд Jinja2 с rest_framework.