Django Rest Framework - 如何在 urls.py 中获取 Http 标头信息

Posted

技术标签:

【中文标题】Django Rest Framework - 如何在 urls.py 中获取 Http 标头信息【英文标题】:Django Rest Framework - how to get Http header information in urls.py 【发布时间】:2015-09-02 00:38:15 【问题描述】:

我正在制作一个基于 Django 的 API,这是我的 urls.py。

from django.conf.urls import include, url

api_version = "v1"

urlpatterns = [
    url(r'^v1/', include( "api."+ api_version +".urls", namespace=api_version )),
]

我想做的是从 http 接受标头中检索 API 版本。我尝试使用 django.http.HttpRequest 模块,但没有成功。

有什么方法可以实现吗?

【问题讨论】:

【参考方案1】:

您无法访问urls.py 上的请求,请参阅:How Django processes a request

您可以在 django-rest-framework 上配置 versioning 并在请求对象上获取 version,例如:

class SampleView(APIView):

 def post(self, request, format=None):
     if request.version == '1':
         return Response(status=status.HTTP_410_GONE)

或使用URLPathVersioning 方法。

【讨论】:

我知道我可以在views.py 中获取版本信息,但我想做的是在urls.py 中检索它。我当前的文件夹结构是 ap​​i/v1/foo/views.py、api/v2/foo/views.py 所以我试图根据 http 标头 api 版本信息在 urls.py 中动态包含视图文件。 您可以让两个 url 使用相同的视图,然后根据 request.version 区分代码 @joelgoldstick 我不想在一个地方添加所有版本的视图逻辑,但我想我必须这样做,因为它需要使用 AcceptHeaderVersioning。谢谢你的回答! @JairHenrique 不幸的是,我的老板希望我使用 AcceptHeaderVersioning【参考方案2】:

您无法访问 url.py 中的请求,对于您的特定 scnerio 即版本, 您可以为不同版本的 api 使用不同的 url。

喜欢

url(r'^v1/', include("api.v1.urls")),
url(r'^v2/', include("api.v2.urls")),
url(r'^v3/', include("api.v3.urls")),

【讨论】:

以上是关于Django Rest Framework - 如何在 urls.py 中获取 Http 标头信息的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest Framework api如何为所有人添加身份验证权限

如何处理 django-rest-framework 中 url 模式中的外键关系

Django REST Framework:如何用空字符串替换 null?

Django Rest Framework:在 ViewSet 上打开分页(如 ModelViewSet 分页)

Django Rest Framework - 如何为所有 ModelSerializer 字段创建自定义错误消息?

使用 django-rest-framework-simplejwt 注册后返回令牌