标签: django-rest-viewsets

CSRF 失败:来源检查失败 - http://localhost:8000/ 与任何可信来源不匹配

请帮我解决问题。我正在构建一个由 Django Rest Framework 和 ReactJS 组成的应用程序。我使用了视图集。

我的错误: 错误的屏幕截图

演示

响应数据:

{"detail":"CSRF Failed: Origin checking failed - http://localhost:8000/ does not match any trusted origins."}
Run Code Online (Sandbox Code Playgroud)

ReactApp中的DeleteLead函数

 export const deleteLead = (id) => (dispatch) => {
  axios
    .delete(`/api/leads/${id}/`)
    .then((res) =>
      dispatch({
        type: DELETE_LEAD,
        payload: id,
      })
    )
    .catch((err) => {
      console.log(err);
    });
};
Run Code Online (Sandbox Code Playgroud)

LeadViewSet:从rest_framework导入视图集,权限从.serializsers导入LeadSerializers从leads.models导入Lead

# lead viewset
class LeadViewSet(viewsets.ModelViewSet):
    queryset = Lead.objects.all()
    # permission - bu ruxsat beruvchi
    permission_classes = [
        permissions.AllowAny # barcha uchun ruxsat
    ]
    serializer_class = LeadSerializers
Run Code Online (Sandbox Code Playgroud)

LeadSerzializers:

# lead serializer …
Run Code Online (Sandbox Code Playgroud)

django permissions csrf django-rest-viewsets csrf-token

12
推荐指数
1
解决办法
1万
查看次数

视图集`create()` 和`update()` 与序列化器`create()` 和`update()` 之间有什么区别?

在这里:http : //www.django-rest-framework.org/api-guide/viewsets/#modelviewset它说“ModelViewSet 类提供的操作是 .list()、.retrieve()、.create() 、.update()、.partial_update() 和 .destroy()。”

在这里:http : //www.django-rest-framework.org/api-guide/serializers/#modelserializer它说“ModelSerializer 类与常规 Serializer 类相同,除了:它包括 . create() 和 .update()。”

1)假设有一个 ViewsetUserViewSet和 routeruser和 serializer UserSerializer。如果我发送了一个POSTto/user/它叫UserViewSet'screate()还是UserSerializer's create()

2)假设UserViewSet有这个权限:

class NoCreate(permissions.BasePermission):
    """
    No one can create this object.
    """
    message = 'You do not have permission to complete the action you are trying to perform.'

    def has_permission(self, request, view):
        if view.action == …
Run Code Online (Sandbox Code Playgroud)

django serialization django-rest-framework django-rest-viewsets

9
推荐指数
2
解决办法
2753
查看次数

Django rest框架中ViewSet和GenericViewSet的区别

我有一个 Django 休息框架GenericViewset,我试图为它设置分页,如下所示:

#settings.py
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 
         'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 20
}

#views.py
class PolicyViewSet(viewsets.GenericViewSet):
    def list(self, request):
        queryset = Policy.objects.all()
        page = self.paginate_queryset(queryset)
        serializer = PolicySerializer(page, many=True)
        return self.get_paginated_response(serializer.data)
Run Code Online (Sandbox Code Playgroud)

这按预期工作。 但是,如果我尝试使用普通的Viewset执行相同的操作,如下所示:

#views.py
class PolicyViewSet(viewsets.ViewSet):
    def list(self, request):
        queryset = Policy.objects.all()
        page = self.paginate_queryset(queryset)
        serializer = PolicySerializer(page, many=True)
        return self.get_paginated_response(serializer.data)
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息:

'PolicyViewSet' 对象没有属性 'paginate_queryset'

如何使用普通的Viewset设置分页。DRF 中的 GenericViewset 和 Viewset 有什么区别?

python django django-rest-framework django-rest-viewsets

9
推荐指数
1
解决办法
8390
查看次数

Django Rest API-使用搜索过滤器搜索方法字段

我试图过滤搜索剩余的api页面,并想使用方法字段作为搜索字段之一,但是,当我这样做时,我收到一条错误消息,指出该字段无效,然后它在模型中列出了唯一的字段有效来源

序列化器:

class SubnetDetailsSerializer(QueryFieldsMixin, serializers.HyperlinkedModelSerializer):
    subnet = serializers.SerializerMethodField()
    device = serializers.ReadOnlyField(
        source='device.hostname',
    )
    circuit_name = serializers.ReadOnlyField(
        source='circuit.name',
    )
    subnet_name = serializers.ReadOnlyField(
        source='subnet.description',
    )
    safe_subnet = serializers.SerializerMethodField()

    def get_safe_subnet(self, obj):
        return '{}{}'.format(obj.subnet.subnet, obj.subnet.mask.replace('/','_')) 

    def get_subnet(self, obj):
        return '{}{}'.format(obj.subnet.subnet, obj.subnet.mask) 

    class Meta:
        model = DeviceCircuitSubnets   
        fields = ('id','device_id','subnet_id','circuit_id','subnet','safe_subnet','subnet_name','device','circuit_name') 
Run Code Online (Sandbox Code Playgroud)

意见:

class SubnetDetailsSet(viewsets.ReadOnlyModelViewSet):
    queryset = DeviceCircuitSubnets.objects.all().select_related('circuit','subnet','device')
    serializer_class = SubnetDetailsSerializer
    permission_classes = (IsAdminUser,)
    filter_class = DeviceCircuitSubnets
    filter_backends = (filters.SearchFilter,)
    search_fields = (
        'device__hostname',
        'circuit__name',
        'subnet__subnet',
        'safe_subnet'
    )
Run Code Online (Sandbox Code Playgroud)

如何在搜索字段中包含safe_subnet?

谢谢

编辑 这是现在的代码

views.py

class SubnetDetailsSet(viewsets.ReadOnlyModelViewSet):
    queryset …
Run Code Online (Sandbox Code Playgroud)

django django-rest-framework django-rest-viewsets

9
推荐指数
2
解决办法
233
查看次数

如何完全不允许 PUT 方法但允许 DRF ViewSet 中的 PATCH?

PUT并且PATCH都是同一个 mixin (The UpdateModelMixin ) 的一部分。

所以如果我像这样扩展它:

class UserViewSet(mixins.UpdateModelMixin, GenericViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
Run Code Online (Sandbox Code Playgroud)

这两个PUTPATCH是允许的。我想完全不允许PUT我的应用程序(因为PATCH已经完成了工作,并且我想仅使用 限制对象创建POST)。一种方法是创建权限:

class NoPut(permissions.BasePermission):
    """
    PUT not allowed.
    """
    message = 'You do not have permission to complete the action you are trying to perform.'

    def has_object_permission(self, request, view, obj):
        if view.action == "update":
            return False
        return True
Run Code Online (Sandbox Code Playgroud)

并将此权限授予我所有允许PATCH. 这是最好的方法吗?有没有更优选的方式?

编辑:查看@wim 提供的答案后,这会是一个很好的解决方案吗(除了映射put被删除外,所有内容都保持不变):

from rest_framework.routers import SimpleRouter
class …
Run Code Online (Sandbox Code Playgroud)

django-rest-framework django-rest-viewsets

8
推荐指数
3
解决办法
4135
查看次数

覆盖 Djangorest ViewSets 删除行为

我已经定义了一个这样的模型:

class Doctor(models.Model):
    name = models.CharField(max_length=100)
    is_active = models.BooleanField(default=True)
Run Code Online (Sandbox Code Playgroud)

我的序列化器:

class DoctorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Doctor
        fields = ('id', 'name', )
Run Code Online (Sandbox Code Playgroud)

在视图中:

class DoctorViewSet(viewsets.ModelViewSet):
    queryset = Doctor.objects.all()
    serializer_class = DoctorSerializer
Run Code Online (Sandbox Code Playgroud)

现在,我可以通过使用 http 方法DELETE调用 url: 'servername/doctors/id/'来删除医生。但是,我想覆盖此模型的删除行为。我希望,当用户删除一条记录时,它的is_active字段设置为false,而不实际从数据库中删除记录。我还想保留 Viewset 的其他行为,如列表、放置、创建等。

我怎么做?我在哪里编写覆盖此删除行为的代码?

python django django-rest-framework sql-delete django-rest-viewsets

7
推荐指数
1
解决办法
3888
查看次数

Django DRF 将 request.user 添加到模型序列化器

我正在使用 django rest 框架,并且我有一个通过模型视图集和模型序列化器创建的对象。此视图只能由经过身份验证的用户访问,并且对象应将其“uploaded_by”字段设置为该用户。

我已经阅读了文档,并得出结论,这应该可行

视图集:

class FooViewset(viewsets.ModelViewSet):
    permission_classes = [permissions.IsAdminUser]
    queryset = Foo.objects.all()
    serializer_class = FooSerializer

    def get_serializer_context(self):
        return {"request": self.request}
Run Code Online (Sandbox Code Playgroud)

序列化器:

class FooSerializer(serializers.ModelSerializer):
    uploaded_by = serializers.PrimaryKeyRelatedField(
        read_only=True, default=serializers.CurrentUserDefault()
    )

    class Meta:
        model = Foo
        fields = "__all__"
Run Code Online (Sandbox Code Playgroud)

但是,这会导致以下错误:

django.db.utils.IntegrityError: NOT NULL constraint failed: bar_foo.uploaded_by_id
Run Code Online (Sandbox Code Playgroud)

这表明序列化程序没有填充“uploaded_by”。

根据我对文档的理解,这应该已将该字段添加到来自序列化程序的验证数据中,作为 create 方法的一部分。

显然我误解了一些东西!

django django-serializer django-rest-framework django-rest-viewsets

7
推荐指数
1
解决办法
3061
查看次数

如何在Django Rest框架的ViewSet中设置方法不要求身份验证

我有如下的观点

from rest_framework import viewsets
from paas.serializers import UserSerializer
import logging


logger=  logging.getLogger(__name__)

class UserViewSet(viewsets.ViewSet):
    def list(self,request):
        pass

    def create(self,request):
        logger.info(request.data)
        current_user = UserSerializer.create()
Run Code Online (Sandbox Code Playgroud)

另外,我在代码中使用了基于DRF令牌的身份验证。我怎样简单地说这种create方法不需要身份验证?如您所知,在使用令牌实现身份验证之后,所有请求都应该Token在标头中,而任何没有请求的请求都将收到403错误。

django django-rest-framework django-rest-viewsets

6
推荐指数
1
解决办法
969
查看次数

在 Django REST Framework 中使用 multipart/form-data 上传多个图像和嵌套 json

我在解析视图集中的request.data时遇到问题。我有一个模型,可以根据产品添加多个图像。

我想从传入数据中分离图像,将产品数据发送到 ProductSerializer,然后将图像与产品数据一起发送到其序列化器并保存。

我有两个模型,就像这样:

def Product(models.Model):
    name = models.CharField(max_length=20)
    color = models.ForeignKey(Color, on_delete=models.CASCADE)

def Color(models.Model):
    name = models.CharField(max_length=15)

def ProductImage(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    image = models.ImageField(upload_to='product_pics/')
Run Code Online (Sandbox Code Playgroud)

我想发送到产品(127.0.0.1:8000/products/)的请求就像:

{
    "name": "strawberry",
    "color": {
        "name": "red"
    },
    "productimage_set": [
        {"image": "<some_encode_image_data>"}
    ]
}
Run Code Online (Sandbox Code Playgroud)

序列化器没有什么特别的,只是提取标签链接,所以我没有写它。如何发送多部分/表单数据以及如何在视图集中解析它?或者解决办法是什么?

python django serialization django-rest-framework django-rest-viewsets

6
推荐指数
1
解决办法
6293
查看次数

Django REST API 在发布请求中接受列表而不是字典

我正在尝试使用来自以这种格式发送 POST 请求的回调 API 的数据:

[
  {
    "key1": "asd",
    "key2": "123"
  }
]
Run Code Online (Sandbox Code Playgroud)

然而,我的 API 目前仅在像这样发送时才有效:

{
  "key1": "asd",
  "key2": "123"
}
Run Code Online (Sandbox Code Playgroud)

序列化器.py:

class RawIncomingDataSerializer(serializers.ModelSerializer):
    class Meta:
        model = RawIncomingData
        fields = '__all__'
Run Code Online (Sandbox Code Playgroud)

视图.py:

class RawIncomingDataViewSet(viewsets.ModelViewSet):
    queryset = RawIncomingData.objects.all()
    serializer_class = RawIncomingDataSerializer
Run Code Online (Sandbox Code Playgroud)

发布数据中只会有一个对象,因此我正在寻找一种简单的解决方法,而无需重写序列化器来解释一个发布请求中的多个对象。

python django django-rest-framework django-rest-viewsets

6
推荐指数
1
解决办法
1500
查看次数