【发布时间】:2021-10-03 11:25:20
【问题描述】:
我正在用 django 和 vue js 开发一个网络应用程序。我编写了一个函数来向 api 发出请求,到目前为止一切顺利,但是在我的第一个 post 请求中我遇到了问题:
这里有:
onsubmit 函数、发出请求的函数、api 和权限
onSubmit() {
if (!this.questionBody) {
this.error = 'Devi inserire un domanda!'
} else if (this.questionBody.length > 240){
this.error = 'La tua domanda deve contenere meno di 240 caratteri!'
} else {
let endpoint = 'api/questions/';
let method = 'POST';
apiService(endpoint, method, {content:this.questionBody})
.then(data =>
this.$router.push({
name: 'question',
params: { slug: data.slug }
}));
}
function apiService(endpoint, method, data) {
const config = {
method: method || 'GET',
body: data !== undefined ? JSON.stringify(data) : null,
headers: {
'content-type': 'application/json',
'X-CSRFToken': CSRF_TOKEN
}
};
return fetch(endpoint, config)
.then(data => getJson(data))
.catch(err => err)};
class QuestionViewSet(viewsets.ModelViewSet):
queryset = Question.objects.all().order_by('-created_at')
serializer_class = QuestionSerializer
lookup_field = 'slug'
permission_classes = [IsAuthenticated, IsAuthorOrReadOnly]
def perform_create(self, serializer):
serializer.save(author=self.request.user)
class IsAuthorOrReadOnly(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return True
return request.user == obj.author
我在提交表单时收到一个 403 状态码,注意到如果我使用 django rest 框架提供的可浏览 API 发出请求,效果很好。
【问题讨论】:
-
你读过Wikiepedia和MDN吗?我的第一个猜测是
return request.user == obj.author返回False。 -
@jabaa 我也注意到了这一点,但正如我所写,使用可浏览的 api 它可以工作。
-
您可以在调试器中启动服务器并在
has_object_permission的第一行设置断点。但你应该先阅读How to debug small programs -
@jabaa 我已经在权限类中设置了默认的
return True,但它仍然不起作用。 -
我发现问题出在 csrf_token 上,我现在粘贴它,但在帖子请求中它尚未发送。
标签: javascript python django vue.js django-rest-framework