- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个插件包装器来提供 app至restfull ,问题是应用程序不处理 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提供了两种可以重写请求方法的方法。
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
.
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',
)
但请记住,此方法将覆盖所有 PUT
向 POST
请求方法方法。
在这里,PutRequestMethodOverrideMiddleware
会在最后执行。你可以把它放在你想让它执行的位置。
关于django - 如何在 Django Rest Framework 中重写请求方法(从 'PUT' 变为 'POST' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31458985/
这个问题在这里已经有了答案: 10年前关闭。 Possible Duplicates: What is a framework? What does it do? Why do we need a f
我在按照 http://msdn.microsoft.com/en-us/data/jj591621.aspx 处的 Microsoft Data Developer 过程启用代码优先迁移时遇到了一些
我正在从 迁移项目 Entity Framework 4.3 在 .net 4 上运行到 Entity Framework 5 在 .net 4.5 上运行。在不做任何更改的情况下,当我尝试运行该项目
我正在使用 Entity Framework 6 并使用 EntityFramework Extended 来执行一些批量更新和批量删除。批量更新和批量删除工作正常,但我还需要知道更新/删除的实体(即
我在实体上添加了一个列,然后从模型中生成数据库或构建解决方案,然后收到一条消息,提示我刚添加的新列未映射。该数据库以前是从模型创建的,没有错误。 当我右键单击Entity并选择Table Mappin
每次我尝试运行我的代码时都会崩溃,因为我尝试启动函数以调用 SDK 的任何部分。 我在构建过程中包含了 FoundationSDK: 并且我在头文件中包含了对 SDK 的引用: 但是每次我运行这个,我
我以前能够毫无问题地提交我的申请。我的工作流程中唯一改变的部分是使用 Sourcetree。在对以下框架进行更新后,我在提交到 iOS App Store 时收到此警告。我还收到一封电子邮件,其中包含
假设我为 Asp.NET Web 应用程序安装了 .NET Framework 2.0、3.0、3.5。 我意识到 Framework 3.0 和 3.5 只是 Framework 2 的扩展,不太清
是否有 SaveChanges 事件在保存更改后但在更新更改跟踪器之前触发? 我正在使用 EF 6。 我需要在某个实体的状态发生变化时执行任务。 我已经覆盖了 SaveChanges 来设置它。我可以
我正在使用一个现有的数据库,并且我已经将其中一个表映射为一个实体(因为我需要映射一个外键)。 因此,在初始化此数据库时,我希望 EF 忽略此实体,因为它已经存在。 我该怎么做? 最佳答案 您应该使用
我有 3 个表需要与 Entity Framework 进行映射,但我不确定解决此问题的正确方法。这是我的 3 个实体: public class User { [Key] public
我首先使用 VS 2010 和 Entity Framework 代码(版本 6)。我有两个实体,每个实体都在自己的上下文中,我想在它们之间创建一对多关系。 上下文 1 具有以下实体: public
我知道 EF 在 CodePlex 上是开源的,但我没有看到当前发布的 5.0 版本的分支。我在哪里可以得到这个源代码? 最佳答案 没有。他们只开源了 post 5 版本。第一次签到可能足够接近,但再
我们目前有一个数据库很大的系统,存储过程既用于CUD又用于查询。数据集用于从 SP 查询中检索结果。 现在我们正在研究使用 Entity Framework 针对同一个数据库开发另一个项目。在查询数据
我有一个每 10 秒运行一次的 Windows 服务......每次运行时,它都会获取一些测试数据,对其进行修改并使用 EntityFramework 将其保存到数据库中。但是,在每一秒运行时,当我尝
我对在我们的场景中仅将 Entity Framework 与存储过程一起使用的合理性有疑问。 我们计划拥有一个 N 层架构,包括 UI、BusinessLayer (BLL)、DataAccessLa
当我使用 Entity Framework 时,我想在上下文中查询出一条记录并将其添加到具有相同架构的另一个上下文中,在查询出记录后,我将其从上下文中分离出来,但是相关实体都没有了,是吗?有什么办法解
我正在使用 Entity Framework 5 构建 ASP.Net MVC4 Web 应用程序。我必须使用现有的 sql server 数据库,但也想使用 Code First,所以我遵循了本教程
在 Entity Framework 4.0 中使用 T4 模板创建 POCO 会丢失什么?为什么使用 Entity Framework 4.0 时的默认行为不创建 POCO? 最佳答案 你会失去很多
我在网上使用 Repository Pattern 和 EF 看了很多例子。但他们都没有真正谈到与相关实体的合作。 就像说用户可以有多个地址。 IUserRepository User CreateU
我是一名优秀的程序员,十分优秀!