【发布时间】:2021-09-25 14:18:46
【问题描述】:
当我尝试提交使用 DRF API 的 ajaxified 表单时,我会进入浏览器控制台!
POST http://localhost:8000/api/texts/ 403(禁止)
这是我的 html 文件:
<form id="text-form" method="POST" action="">
<input type="text" name="title" placeholder="Title" class="form-control mb-3 pb-2"
maxlength="200" required id="title">
<input type="date" name="deadline" placeholder="Deadline" autocomplete="off"
class="form-control mb-3" id="myflatpickr">
<textarea name="requirements" cols="40" rows="4"
placeholder="requirements"
class="form-control col mt-3" maxlength="200" required id="requirements"></textarea>
<textarea name="document" cols="40" rows="10"
placeholder="document"
id="editor" class="form-control" required></textarea>
<button type="submit">Submit</button>
</form>
这是我的 javascript 文件
$("#text-form").submit(function (event) {
event.preventDefault();
$textData = $("#text-form").serialize()
$.ajax({
url: "http://localhost:8000/api/texts/",
method: "POST",
data: $textData,
success: function() {
console.log($textData)
},
error: function() {
console.log("there is an error")
}
})
});
在 serializers.py 中:
from django.contrib.auth import get_user_model
from django.contrib.auth.password_validation import validate_password
from rest_framework import serializers
from .models import *
class TextSerializer(serializers.ModelSerializer):
author = serializers.HiddenField(
default=serializers.CurrentUserDefault()
)
class Meta:
model = Text
fields = '__all__'
在我的views.py文件中:
class ApiTextList(generics.ListCreateAPIView):
queryset = Text.objects.all()
serializer_class = TextSerializer
permission_classes = [
permissions.AllowAny
]
class ApiTextDetail(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
http_method_names = ['get', 'head']
queryset = Text.objects.all()
serializer_class = TextSerializer
permission_classes = [
permissions.AllowAny
]
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
在 urls.py 中
from django.urls import path
from . import views
urlpatterns = [
path('api/texts/', views.ApiTextList.as_view()),
path('api/texts/<int:pk>/', views.ApiTextDetail.as_view()),
]
注意:当我尝试从 drf 在“localhost:8000/api/texts”中提供的界面添加文本时,我通常会添加它
【问题讨论】:
-
您如何验证用户身份?当您将请求发送到
api/texts时,您似乎没有任何标头 -
响应的detail字段中是否有关于错误的详细信息?
-
@bdbd 我正在使用 django 的默认身份验证系统以及登录和身份验证功能对用户进行身份验证
-
@Mickaelmartinez 哦,我没有注意到,它说“详细信息:“CSRF 失败:CSRF 令牌丢失或不正确。” ' 请注意,我有另一个用户注册表单,其代码相同,但没有 csrf 令牌,你能解释一下为什么它在没有 csrf 令牌的情况下工作
标签: python python-3.x django ajax django-rest-framework