1

我尝试返回使用 django-countries 和 django rest 框架的国家/地区的选择选项列表。我使用 JWT_AUTH 进行身份验证。

当我尝试选项请求时:

curl \
  -H "Authentication: JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFsYmVydG9fdmVudGEiLCJ1c2VyX2lkIjoyLCJlbWFpbCI6IiIsImV4cCI6MTUwODE2Mzg4Mn0.svxqTThCahSl1Vu27sMjuJyd1PRLk28-Xgn2OKKb5-g"\
  -X OPTIONS \
  -v http://127.0.0.1:8000/api/v1/core/perfilViajeroUserPass/

回应是:

{
 "name":"Perfil Viajero User Pass Create",
 "description":"",
 "renders":["application/json","text/html"],
 "parses":[
           "application/json",
           "application/x-www-form-urlencoded",
           "multipart/form-data"
          ]
}

但我认为默认情况下应该是这样的:

{
"name": "To Do List",
"description": "List existing 'To Do' items, or create a new item.",
"renders": [
    "application/json",
    "text/html"
],
"parses": [
    "application/json",
    "application/x-www-form-urlencoded",
    "multipart/form-data"
],
"actions": {
    "POST": {
        "note": {
            "type": "string",
            "required": false,
            "read_only": false,
            "label": "title",
            "max_length": 100
        }
    }
}

}

有人可以帮助我吗?谢谢。

4

3 回答 3

1

如果要更改某些内容:

  • nameget_view_name视图的名称,它是稍微修改的视图名称。
  • descriptionget_view_description修改视图文档字符串的视图。

否则,如果您想要更复杂的东西,您可能需要自定义视图的元数据,如http://www.django-rest-framework.org/api-guide/metadata/#custom-metadata-classes中所述

于 2017-11-03T10:31:20.603 回答
0

我找到了解决方案。

我将视图类类型从APIViewto更改为generics.CreateAPIView并知道它有效。非常感谢。

于 2017-11-06T10:36:44.460 回答
0

添加另一个答案,因为我最近遇到了同样的问题,发现它有点神秘——在发出OPTIONS请求时,Django Rest Framework 使用视图的Metadata类来构造响应。如文档中所述,默认Metadata类是。但是,仅当相关视图定义了方法时,才将键添加到响应正文中。我不确定为什么会这样,但请参阅此处以获取相关代码。SimpleMetadataSimpleMetadataactionsget_serializer()

rest_framework.generics.GenericAPIView 定义了一个get_serializer()方法,因此对这些视图发出的(经过身份验证的)OPTIONS请求将返回一个带有actions密钥的响应正文。但是rest_framework.views.APIView没有定义这个方法,所以actionskey会一直不存在。

如果您必须使用,您可以通过在 APIView 类上rest_framework.views.APIView定义一个方法来解决此问题。get_serializer()感觉有点hacky,但我测试了它并且它有效:

class MyView(views.APIView):
    def get_serializer(self):
        return MySerializer()

    def post(self):
        ...
于 2022-03-03T01:14:55.007 回答