【问题标题】:Why do I receive a 403 status when I make this request?为什么我在提出此请求时会收到 403 状态?
【发布时间】: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 发出请求,效果很好。

【问题讨论】:

  • 你读过WikiepediaMDN吗?我的第一个猜测是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


【解决方案1】:

Django 接受来自浏览器的请求而不是来自您的代码的请求这一事实......也许 http 标头中缺少某些东西,例如 "User-Agent": "Mozilla/5.0" 或类似的东西,是的 检查是否也很重要Django API 响应从您的服务器发出的请求,一些 api 只接受来自服务器的请求,而不接受来自客户端的请求,在这个例子中,vuejs 中的代码从客户端的计算机发出请求,并且也许 Django 服务器不接受这种方式。 也许这也是一个 CORS 问题:https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-12-04
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 2015-03-15
相关资源
最近更新 更多