Развертывание 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