【问题标题】:Django allow anonymous ajax request to access a Generic ViewDjango 允许匿名 ajax 请求访问通用视图
【发布时间】:2021-03-03 16:17:22
【问题描述】:

这是我目前得到的:

from django.views.generic import View
from django.views.decorators.csrf import csrf_exempt

class ConfigurationView(View):

    @csrf_exempt
    def dispatch(self, *args, **kwargs):
        return super(ConfigurationView, self).dispatch(*args, **kwargs)

    def get(self, request):
        ...

但是,当我向该视图发出 ajax get 请求时,我无法访问 get 方法

function getCookie(name) {
    let cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        const cookies = document.cookie.split(';');
        for (let i = 0; i < cookies.length; i++) {
            const cookie = cookies[i].trim();
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

$.ajax({
  url: "https://{{ domain }}/configure",
  headers: {
    'X-CSRFToken': getCookie('csrftoken')
  },
  crossDomain: true,
  data: {
    email: "{{ email }}",
  },
  dataType: "json"
})

我认为我正确地发送了csrftoken,我不应该真的需要csrf_exempt,但无论哪种方式,请求都会重定向到登录页面。

任何帮助将不胜感激。

【问题讨论】:

  • 如果重定向到登录页面,则不是csrf的问题。检查是否有任何权限类或设置应用于视图
  • 感谢您的快速回答!目前没有任何权限类。我尝试添加一个新的权限类(IsReadOnly),但它甚至没有进入权限类
  • 我在徘徊是否需要通过某种允许这些端点的中间件

标签: javascript python django ajax rest


【解决方案1】:

问题实际上并不是csrftoken,而是我必须实现一个中间件来处理那些匿名端点:

from django.utils.deprecation import MiddlewareMixin


class AuthMiddleware(MiddlewareMixin):

    anonymous_whitelist = [
        '/<django_app>/configure',
    ]

    def anonymous_allowed(self, path):
        if path in self.anonymous_whitelist:
            return True

        return False

【讨论】:

    猜你喜欢
    • 2011-04-06
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 2014-09-02
    • 2019-11-23
    • 2016-08-31
    相关资源
    最近更新 更多