一个使用 Django、DRF、swagger 的项目。
url 配置如下:
schema_view = get_swagger_view(title='Pastebin API')
urlpatterns = [
url(r'^$', schema_view),
url(r'store', include('store.urls')),
... # other urls using routers.SimplerRouter
]
和存储/urls.py:
router = routers.SimpleRouter()
router.register(r'', views.StoreViewSet)
urlpatterns = router.urls
和views.StoreViewSet:
class StoreViewSet(BaseObject, GenericViewSet):
permition_class = ()
@list_route()
def detail(self, request):
return {}
@list_route(url_path='detail/export')
def detail_export(self, request):
return {}
python manage.py runserver
后,访问http://127.0.0.1:8000/#
,出现TypeError:
File "/usr/local/share/.virtualenvs/dev-finance/lib/python2.7/site-packages/rest_framework_swagger/views.py", line 32, in get
schema = generator.get_schema(request=request)
File "/usr/local/share/.virtualenvs/dev-finance/lib/python2.7/site-packages/rest_framework/schemas.py", line 242, in get_schema
links = self.get_links(request)
File "/usr/local/share/.virtualenvs/dev-finance/lib/python2.7/site-packages/rest_framework/schemas.py", line 276, in get_links
insert_into(links, keys, link)
File "/usr/local/share/.virtualenvs/dev-finance/lib/python2.7/site-packages/rest_framework/schemas.py", line 79, in insert_into
target[keys[-1]] = value
TypeError: 'Link' object does not support item assignment
[ERROR] 2017-05-04 15:25:06,936 log_message(basehttp.py:131) "GET / HTTP/1.1" 500 20384
错误消息显示,Link
对象无法像 dict 那样赋值。
如果我将方法名称从 detail_export
重命名为 details_export
,一切都会恢复正常。
rest_framework的@list_route
装饰器出现猜测错误
将方法的 url 传输到 Link 对象。
为什么其他方法都可以? 我该如何解决这个问题?
最佳答案
这是 the bug in DRF .可能会在 3.6.4 中修复。现在您可以:
从
list_route
中删除url_path
:class StoreViewSet(BaseObject, GenericViewSet): permition_class = () @list_route() def detail(self, request): return {} @list_route() def detail_export(self, request): return {}
或者将自定义
SchemaView
与自定义SchemaGenerator
一起使用:# api/schema.py for example from rest_framework.permissions import AllowAny from rest_framework.renderers import CoreJSONRenderer from rest_framework.response import Response from rest_framework.schemas import SchemaGenerator from rest_framework.views import APIView from rest_framework_swagger import renderers class CustomSchemaGenerator(SchemaGenerator): def get_keys(self, subpath, method, view): result = super().get_keys(subpath, method, view) # here you can fix your path if result == ['store', 'detail', 'detail_export']: return ['store', 'detail_export'] return result class SwaggerSchemaView(APIView): _ignore_model_permissions = True exclude_from_schema = True permission_classes = [AllowAny] renderer_classes = [ CoreJSONRenderer, renderers.OpenAPIRenderer, renderers.SwaggerUIRenderer ] def get(self, request): generator = CustomSchemaGenerator(title='API') return Response(generator.get_schema(request=request)) # urls.py from django.contrib.auth.decorators import login_required from api.schema import SwaggerSchemaView urlpatterns = [ # ... url(r'^swagger-url/', login_required(SwaggerSchemaView.as_view())) # ... ]
关于python - django_rest_framwork 发生 "TypeError: ' 链接对象不支持项目分配”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43778668/