如何在Django Tastypie中封装包含自定义端点的全部资源方法
问题原因
你当前使用的是Tastypie框架的ModelResource,自带的CRUD标准方法(如patch_detail)会走基类的dispatch分发流程,因此你重写的dispatch逻辑能正常触发。而自定义的get_something_extra这类额外端点,通常是通过重写prepend_url方法直接绑定路由到对应业务方法,跳过了dispatch分发步骤,自然不会触发dispatch里的包装逻辑。
解决方法
- 方案1:修改自定义路由绑定逻辑,走
dispatch分发流程
你在prepend_url中注册自定义路由时,不要直接绑定到业务方法,改为绑定到dispatch,并传入自定义的request_type参数即可:
之后保持你原有的def prepend_url(self): return [ url(r'^something_extra/$', self.wrap_view('dispatch'), kwargs={'request_type': 'something_extra'}, name='api_something_extra'), ]get_something_extra方法命名即可,Tastypie的dispatch会自动根据请求方法+request_type匹配到对应的业务方法。 - 方案2:重写
wrap_view方法统一包装所有端点(更推荐)
Tastypie所有绑定到路由的方法都会经过wrap_view包装,重写该方法可以一次性覆盖CRUD和自定义端点,无需修改其他业务代码:class SomeBaseResource(ModelResource): class Meta(...): ... def wrap_view(self, view): wrapped_view = super().wrap_view(view) @decorator_to_wrap_all_methods_with(...) def wrapper(request, *args, **kwargs): logger.info('Enter') response = wrapped_view(request, *args, **kwargs) logger.info('Exit') return response return wrapper - 方案3:给自定义端点单独加装饰器
如果自定义端点数量不多,可以直接给每个自定义方法加上你用在dispatch上的同一个装饰器,不需要修改基类逻辑:@decorator_to_wrap_all_methods_with(...) def get_something_extra(self, request, **kwargs): ...
内容的提问来源于stack exchange,提问作者user2552806
相关产品推荐
相关产品推荐

