Развертывание django restframeworkapi на сервере

я хочу установить post req для моего api приложения. в postman когда я отправляю post в объектной программе, он возвращает следующий текст в качестве ответа и данные не сохраняются в базе данных.

я получил в браузере:


Employee List

POST /employees/

HTTP 403 Forbidden
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "detail": "CSRF Failed: CSRF token missing or incorrect."
}

но я получил другую ошибку в postman:

Server Error (500)

установлен:

DEBUG = False
ALLOWED_HOSTS = ['*']

в settings.py Но проблема все еще не решена, и ошибка остается.

Что мне следует сделать, чтобы исправить эту ошибку?

views.py

from django.shortcuts import render

# Create your views here.

from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from . models import employees
from . serializers import employeeSerializer



class employeeList(APIView):
    def get(self, request):
        employees1 = employees.objects.all()
        serializer = employeeSerializer(employees1, many=True)
        return Response(serializer.data)
    def post(self):
        pass

models.py

from django.db import models

# Create your models here.

class employees(models.Model):
    firstName=models.CharField(max_length=10)
    lastName=models.CharField(max_length=10)
    emp_id=models.IntegerField()

    def __str__(self) -> str:
        return self.firstName

urls.py

"""
Definition of urls for UpmenuDjango.
"""

from datetime import datetime
from django.urls import path
from django.contrib import admin
from django.contrib.auth.views import LoginView, LogoutView

# from app import forms, views
from rest_framework.urlpatterns import format_suffix_patterns
from webapp import views

urlpatterns = [
    # path('', views.home, name='home'),
    # path('contact/', views.contact, name='contact'),
    # path('about/', views.about, name='about'),
    # path('login/',
    #     LoginView.as_view
    #     (
    #         template_name='app/login.html',
    #         authentication_form=forms.BootstrapAuthenticationForm,
    #         extra_context=
    #         {
    #             'title': 'Log in',
    #             'year' : datetime.now().year,
    #         }
    #     ),
    #     name='login'),
    # path('logout/', LogoutView.as_view(next_page='/'), name='logout'),
    path("admin/", admin.site.urls),
    path("employees/", views.employeeList.as_view()),
]

Добавьте @csrf_exempt к вашему запросу во время тестирования.

Примечание: это не стоит делать в производстве, но это поможет при использовании Postman.

Чтобы не применять защиту csrf, оберните свой маршрут символом csrf_exempt().

from django.views.decorators.csrf import csrf_exempt
...
path("employees/", csrf_exempt(views.employeeList.as_view())),

Более подробную информацию можно найти здесь.

Ваша ошибка 500 может быть связана с тем, что вы передаете только пост-запрос, попробуйте вернуть return Response(status=200).

class employeeList(APIView):
    ...
    def post(self):
        return Response(status=200)

Это сложно.

Надеюсь, я ничего не напутал, но вы, вероятно, используете некоторые SessionAuthenticaion в вашем AUTHENTICATION_BACKENDS. Этот бэкенд использует CSRF-протекцию. Я столкнулся с этим сбоем по крайней мере один раз :)

Чтобы предложить быстрое исправление, вы можете просто добавить authentication_classes = () к вашему APIView следующим образом

class employeeList(APIView):
    authentication_classes = ()

    def get(self, request):
        employees1 = employees.objects.all()
        serializer = employeeSerializer(employees1, many=True)
        return Response(serializer.data)
    def post(self):
        pass

Если проблема не исчезла, проверьте DEFAULT_AUTHENTICATION_CLASSES и, если SessionAuthentication является его частью, удалите его. Для проверки вы можете быстро использовать:

from rest_framework.settings import api_settings

print(api_settings.DEFAULT_AUTHENTICATION_CLASSES)

Я наконец-то нашел ответ на эту проблему! Я изменил эти строки и решил свою проблему.

project urls.py

path("employees/", csrf_exempt(views.employeeList.as_view())) 

settings.py

DEBUG = True

ALLOWED_HOSTS = []

view.py

def post(self, request):
        pass
Вернуться на верх