python - 根据 header 身份验证 token 过滤 API 请求

标签 python django django-rest-framework

我想根据随 GET 请求发送的 token header 来过滤对象。

我的请求正在 header 中发送 token ( get curl -H "Authorization: Token 3f3f3fzzz" https://1.com/api )

下面的代码不返回任何结果(只是一个空数组 - 没有错误)。我无法确定我的请求对象 header 在哪里。

我的猜测是,我需要一些中间件函数来改变响应并将用户对象也放入其中。

views.py

class AllViewSet(viewsets.ModelViewSet):
    queryset = Movie.objects.order_by('-created',)
    serializer_class = AllSerializer
    def get_queryset(self):
        Movie.objects.filter(owner = self.request.user)

我在 def_queryset 之后尝试了一些调试(使用 import pdb; pdb.set_trace() )。

def(sel.request)返回:http://dpaste.com/2VQARE3

这是我的代码中可能相关的其他部分。

models.py

@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
    if created:
        Token.objects.create(user=instance)

class Movie(models.Model):
    title = models.CharField("Title", max_length=10000, blank=True)
    tag = models.ManyToManyField('Tag', blank=True)
    created = models.DateTimeField("Created", auto_now_add=True)
    owner = models.ForeignKey('auth.User', blank=True, null=True)

设置.py

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    )
}

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
)

最佳答案

您可以编写自定义过滤器后端 http://www.django-rest-framework.org/api-guide/filtering/#custom-generic-filtering

from rest_framework import filters
class OwnerFilterBackend(filters.BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        return queryset.filter(owner=request.user)

class AllViewSet(viewsets.ModelViewSet):
    filter_backends = (OwnerFilterBackend,)
    ...

关于python - 根据 header 身份验证 token 过滤 API 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40478762/

相关文章:

python - 将颜色条添加到频谱图中

python - nx.write_dot(...) 当输入节点有冒号时生成冗余节点

Django-filter 按相关字段过滤

api - 为什么要使用异步/非阻塞框架构建 API?

python - 在Python中访问大量未排序的数组元素

python - 按住键时如何使 Sprite 移动

django - fatal error : libmemcached/memcached. h: 没有这样的文件或目录

python - Django 外键选择字段为空

django - 在 for 循环 django 中构建 When Case 查询

python - 覆盖 DRF 中序列化程序的数据属性