gpt4 book ai didi

django - 如何在 Django Rest Framework 中重写请求方法(从 'PUT' 变为 'POST' )

转载 作者:行者123 更新时间:2023-12-01 23:05:07 25 4
gpt4 key购买 nike

我正在编写一个插件包装器来提供 apprestfull ,问题是应用程序不处理 PUT 请求,然后我从 resfull 中获取 PUT 请求,并且应该将请求的方法更改为 POST 请求。

我已经尝试过这个:

self.context['request'].method = 'POST'

但显然不起作用

我怎样才能做到呢?谢谢

更新:

序列化器代码:

class PageEditSerializer(serializers.ModelSerializer):
"""
Serializer Class to edit and delete a Page.
"""
raw = serializers.CharField()

def save(self):

#no works
self.context['request'].method = 'POST'

"""call to waliki new function"""
views.edit(self.context['request'], self.instance.slug)

class Meta():
model = Page
fields = ('id', 'title', 'slug', 'raw', )
read_only_fields = ('id', 'slug', )

查看代码:

class PageEditView(generics.RetrieveUpdateAPIView):
"""
A simple View to edit a Page.
"""
lookup_field = 'slug'
serializer_class = PageEditSerializer
permission_classes = (permissions.AllowAny, )

def get_queryset(self):
return Page.objects.filter(slug=self.kwargs['slug'])

最佳答案

我将我的答案分为三个部分。

第 1 部分:Django Rest Framework (DRF) 是否明确支持请求方法重写?

是的,DRF提供了两种可以重写请求方法的方法。

  1. 使用隐藏表单字段:

DRF支持基于浏览器的PUT , DELETE和其他方法,通过重载POST使用隐藏表单字段的请求。

例如:

<form action="/some/url" method="POST">
<input type="hidden" name="_method" value="PUT">
</form>

在上面的例子中,我们重载了 POST方法 PUT通过使用名称为 _method 的隐藏表单字段.

request.method现在将返回PUT而不是POST .

  • 基于 HTTP header 的方法重写:
  • DRF 还支持通过 X-HTTP-Method-Override 进行方法覆盖 header 。只需设置 X-HTTP-Method-Override header 包含所需方法的值。

    例如,制作 PATCH请求通过 POST在 jQuery 中:

    $.ajax({
    url: '/myresource/',
    method: 'POST',
    headers: {'X-HTTP-Method-Override': 'PATCH'},
    ...
    });

    在处理非表单内容(例如 JSON)或在无法识别特定 HTTP 方法(例如 PATCH)的较旧 Web 服务器和/或托管提供商上工作时,此方法非常有用。 .

    第 2 部分:为什么您的代码不起作用?

    请求方法存储在变量 _method 中和属性(property)method用于访问它的值。

    如果有 setter,您设置请求方法值的方式就会起作用。为请求的 _method 定义属性。由于没有定义,所以无法设置 request method 的值以你正在做的方式。

    第 3 部分:如何重写您案例中的请求方法?

    解决方案一(快速):直接设置_method属性

    可以直接设置_method到您想要的值,这将覆盖请求方法。

    class PageEditSerializer(serializers.ModelSerializer):
    """
    Serializer Class to edit and delete a Page.
    """
    raw = serializers.CharField()

    def save(self):

    self.context['request']._method = 'POST' # override the request method

    """call to waliki new function"""
    views.edit(self.context['request'], self.instance.slug)

    class Meta():
    model = Page
    fields = ('id', 'title', 'slug', 'raw', )
    read_only_fields = ('id', 'slug', )

    这会将请求方法覆盖为 POST .

    解决方案 2:设置 X-HTTP-Method-Override通过中间件请求的 header

    何时 initialize_request()在 DRF View 中调用,DRF 检查 X-HTTP-Method-Override Django 请求中的 header 。如果设置了,它将覆盖当前请求 method到该 header 中定义的方法。

    所以在DRF初始化并准备DRF之前request ,我们可以设置X-HTTP-Method-Override header 到我们想要的方法,它将覆盖请求方法。

    我们创建一个PutRequestMethodOverrideMiddleware类并设置 X-HTTP-Method-Override请求中的 header (如果请求是 PUT)并且这个特定的 header 尚未设置。

    class PutRequestMethodOverrideMiddleware(object):  

    def process_request(self, request):
    override_method = request.META.get('X-HTTP-Method-Override')
    if request.method=='PUT' and not override_method:
    # Override method in case of PUT requests and header not already set
    request.META['X-HTTP-Method-Override'] = 'POST' # set to desired method value
    return

    然后在您的设置中,将此中间件添加到您的 MIDDLEWARE_CLASSES .

    MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    ...
    ...
    # your custom middleware
    'my_project.middlewares.PutRequestMethodOverrideMiddleware',
    )

    但请记住,此方法将覆盖所有 PUTPOST 请求方法方法。

    在这里,PutRequestMethodOverrideMiddleware会在最后执行。你可以把它放在你想让它执行的位置。

    关于django - 如何在 Django Rest Framework 中重写请求方法(从 'PUT' 变为 'POST' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31458985/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com