Django: TemplateDoesNotExist (rest_framework / api.html)

76

In meiner Ansichtsfunktion möchte ich ein JSON-Objekt (data1) und etwas Text / HTML (Formular) zurückgeben. Ist das möglich?

MEIN Code

@api_view(['POST'])
@permission_classes((AllowAny,))
def create_user(request):
    if request.is_ajax():
        if request.method == 'POST':
            serializer = SignupSerializer(data=request.data)
            print 'ser'
            print serializer
            if not serializer.is_valid():
                return Response(serializer.errors,\
                                status=status.HTTP_400_BAD_REQUEST)
            else:
                serializer.save()
                data={'status': 'Created','message': 'Verification email has been sent to your email. Please verify your account.'}
                return Response(data, template_name='register.html')
    else:
        return HttpResponse('hello world')

Wenn ich die URL aufrufe, erhalte ich den Statuscode 500 mit dem unten gezeigten Fehler

TemplateDoesNotExist rest_framework / api.html

Wenn ich als API überprüfe, erhalte ich eine Antwort mit dem Status 200 OK. Dies zeigt, dass ich meine HTML-Seite nicht bekommen kann

Wie soll ich mein HTML bekommen, je nach Anfrage

Danke im Voraus

Coeus
quelle

Antworten:

171

Stellen Sie sicher, dass Sie rest_frameworkin Ihren Einstellungen habenINSTALLED_APPS

Linovia
quelle
Es ist bereits vorhanden. Ich glaube, @api_view erlaubt mir nicht, HTML-Seite zu rendern. Gibt es eine andere Lösung
Coeus
Sie möchten dies überprüfen, indem Sie die Django-Shell öffnen und INSTALLED_APPS anzeigen. Es ist unwahrscheinlich, dass api_view funktioniert, da es funktioniert und ein nicht unterstützter HTTP 415-Medientyp zurückgegeben wird.
Linovia
Diese Funktion funktioniert mit CURL-Befehl. Ich erhalte auch eine Antwort. Wenn ich versuche, HTML mit meinem Browser zu rendern, wird der oben aufgeführte Fehler
angezeigt
Dies sollte ausgewählt werden hat Antwort?
Niran
44

pip install djangorestframeworkStellen Sie sicher, dass Sie rest_framework installieren und in die Datei settings.py aufnehmen

INSTALLED_APPS = [
    'rest_framework',
]
Sarath Kumar
quelle
12

Ich habe dieses Problem beim Upgrade von einer alten Django-Version auf Django 2.0 festgestellt. Meine settings.pyhat keinen haben TEMPLATERichtlinie überhaupt, so dass ich die folgenden von einem neuen verhakt django-admin.py startproject ...Lauf:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        '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',
            ],
        },
    },
]

Fügen Sie das zu Ihrem hinzu, settings.pywenn Sie keine TEMPLATESDirektive in Ihrem haben settings.py. Hat für mich gearbeitet.

Ross Rogers
quelle
Insbesondere in meinem Fall 'APP_DIRS': True wurde übersehen; das hat mein Problem behoben.
Abkonsta
12

Dies ist mein Versuch, das Problem zu erklären und die Antworten aller anderen in einer einzigen Liste zusammenzufassen. Vielen Dank an alle, die mir die Schultern zum Stehen gegeben haben!

Ich glaube, das passiert, weil Django REST Framework eine Vorlage ( rest_framework/api.html) rendern möchte , aber die Vorlage nicht gefunden werden kann. Es scheint zwei Ansätze zu geben, um dies zu beheben:

Ansatz 1: Lassen Sie Vorlagen funktionieren

Stellen Sie sicher, dass das REST-Framework enthalten ist INSTALLED_APPSin settings.py:

INSTALLED_APPS = [
    ...
    'rest_framework',
    ...
]

Und stellen Sie sicher, dass APP_DIRSes sich Truein Ihrer Vorlagenkonfiguration befindet (standardmäßig, Falsewenn nicht angegeben). Dadurch kann Django in installierten Anwendungen nach Vorlagen suchen. Hier ist eine minimale Konfiguration, die zu funktionieren scheint, obwohl Sie hier möglicherweise mehr Konfiguration haben:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'APP_DIRS': True,
    },
]

Ansatz 2: Geben Sie eine JSON-Antwort zurück

Wenn Sie REST Framework anweisen, eine JSON-Antwort zu rendern, muss keine Vorlage verwendet werden, sodass Sie die APP_DIRSEinstellungen nicht wie oben beschrieben ändern müssen . Es scheint auch so, als müssten Sie rest_framework möglicherweise nicht einmal auflisten INSTALLED_APPS, obwohl es aus anderen Gründen möglicherweise erforderlich ist, es dort zu haben.

Sie können dies global in settings.py tun:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
    ]
}

Wenn Sie den @api_viewDekorator verwenden, können Sie JSONRenderer für jede Ansicht angeben:

@api_view(['GET'])
@renderer_classes([JSONRenderer])
def some_view(request):
    return Response({'status': 'yay'})

Weitere Informationen finden Sie in der Dokumentation zu REST Framework-Renderern .

Mark Doliner
quelle
6

Ich bin auf dasselbe Problem gestoßen und habe festgestellt, dass rest_framework nicht zu den installierten Apps in settings.py hinzugefügt wurde. Durch Hinzufügen wurde mein Problem behoben.

Bhardwaj Vishal
quelle
2

Versuchen 'rest_framework'Sie INSTALLED_APPS, außer in Ihrem hinzuzufügen, Folgendes in Ihrem hinzuzufügen TEMPLATES.OPTIONS:

'loaders': [
     'django.template.loaders.filesystem.Loader',
     'django.template.loaders.app_directories.Loader'
],
Juwaini
quelle
1

Hinzufügen dieses Dekorators über dieser Ansicht @renderer_classes ([JSONRenderer])

Duc Tran
quelle
1

Ich hatte auch das gleiche Problem. Stellen Sie sicher, dass in Ihrer Einstellung unter "installierte Apps" rest_framework installiert ist.

Technologieproblem Nepal
quelle
1

Verwenden Sie anstelle von HttpResponse:

from rest_framework.response import Response

return Response(data=message, status=status.HTTP_200_OK)
Dotun Peter
quelle
0

Ich bin auf das gleiche Problem gestoßen, ich habe eine leere Antwort gesendet. Versuchen Sie eine andere Infomationen einfügen kann Response()in create_userFunktion zu überprüfen , ob es überhaupt funktioniert

Nickolai Kozhenin
quelle