2014-01-28 255 views
72

我正在使用Django Rest Framework。和我不断收到错误TemplateDoesNotExist - Django错误

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

我不知道我怎么会出错。这是我第一次尝试使用REST框架。 这是代码。

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'), 
) 
+23

你有没有在你的settings.py INSTALLED_APPS中列出“rest_framework”? –

+0

Noobest错误。感谢它。 –

+0

我还有一个疑问。我如何得到一个表单,以便我在表单中发布一些数据,用这些值打到数据库并获得结果? '我如何获得表格?' –

回答

186

确保您已rest_frameworksettings.pyINSTALLED_APPS上市。

+0

也可能是因为未注册DRF的依赖关系。在我的情况下,我不得不将''django_hstore','添加到'INSTALLED_APPS'。 – shacker

5

对我来说,rest_framework/api.html实际上在文件系统上由于损坏的安装或其他未知原因而丢失。重新安装djangorestframework解决了这一问题:

$ pip install --upgrade djangorestframework 
+1

同样的事情发生在我身上。请注意,该命令将升级到可能不兼容的版本(即使您的setup.py和/或requirements.txt另有说明)。你可以尝试点卸载/安装或指定确切的版本。 –

3

请注意,DRF试图在被请求相同的格式返回数据。在你的浏览器中,这很可能是HTML。要指定替代响应,请使用?format=参数。例如:​​。

当您访问在浏览器的API端点和你有包含在安装的应用程序列表中的rest_framework,由其他受访者描述发生的错误TemplateDoesNotExist最常见的。

如果您的应用程序列表中没有包含DRF,但不想使用HTML Admin DRF页面,请尝试使用其他格式来“侧移”此错误消息。

从这里的文档更多信息:http://www.django-rest-framework.org/topics/browsable-api/#formats

3

不是你的情况下,也有可能的原因是为Django定制loaders。例如,如果你在设置(因为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.Loaderloaders那个。

请注意,默认django.template.loaders.app_directories.Loader包含在loaders中。

+0

警告: ?:(1_8.W001)独立的TEMPLATE_ *设置在Django 1.8中已弃用,并且TEMPLATES字典优先。您必须将以下设置的值放入您的默认模板字典:TEMPLATE_DEBUG。 – andi