Django 允许匿名 ajax 请求访问通用视图

Posted

技术标签:

【中文标题】Django 允许匿名 ajax 请求访问通用视图【英文标题】:Django allow anonymous ajax request to access a Generic View 【发布时间】: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),但它甚至没有进入权限类 我在徘徊是否需要通过某种允许这些端点的中间件 【参考方案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

【讨论】:

以上是关于Django 允许匿名 ajax 请求访问通用视图的主要内容,如果未能解决你的问题,请参考以下文章

Django 的 Ajax 视图

是否可以将请求数据访问到 django 通用列表视图中?

Django编写通用更新视图

如何响应 Django 基于类的视图中不允许的方法

Django 跨域请求处理

Django CORS 请求外部重定向不允许