首页 > 解决方案 > 将 i18n_patterns 与 API 一起使用的问题

问题描述

我有一个包含网站和 API 的应用程序。我已将网站翻译成第二语言。目前主要语言是英语,其次是波斯语。我已经习惯i18n_patternsurlpatterns两种语言之间进行重定向。 问题是在使用 API 时,似乎 Django 重定向了我的请求,并且由于数据是使用 发送的POST,因此它会丢弃所有数据并使用GET. 我尝试将 API url 从 urlpattern 中取出,然后附加它以解决此问题,但这不起作用,因为我需要对波斯语提供 Unicode 支持,并且由于没有i18n_patterns这种方式的支持,所以我得到了一个难以理解的响应。
这是 Url 模式:

urlpatterns = i18n_patterns(
    path('admin/', admin.site.urls),
    path('mainapp/', include('mainapp.urls')),
    path('', include('mainapp.urls')),
    prefix_default_language=True
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

urlpatterns.append(path('api/', include('mainapp.api.urls')))

有什么办法可以通过对应用程序进行尽可能少的更改来解决这个问题?任何帮助、建议或指导将不胜感激。

编辑:谢谢。我更改了代码以重现该问题。我打电话http://localhost:8000/api/scan/。如果我用 将 urlpattern 添加path('api/', include('mainapp.api.urls'))到原始 urlpattern 中i18n_patterns,并将请求发送到 API,则该request.POST值是<QueryDict: {}>while 否则它应该将 a 发送key:value到后端。我环顾四周,似乎当您添加i18n_patterns到 urlpatterns 时,会发生重定向,并且由于 HTTP 不允许 POST 数据重定向,我得到一个空响应。

标签: djangourl-pattern

解决方案


的目标i18n_patterns翻译 url 本身,所以你想要一个 API 有点奇怪。这个想法是,在浏览器中查看地址栏的用户会阅读 url,这可能有助于翻译它们,以便他们更容易理解他们在您网站上的位置。例如,如果您有一个英文网址“/shop/product/”,而您希望它是法文中的“/magazin/produit/”。

由于 API 不会向最终用户显示 URL,因此将 API url 归入i18n_patterns. 这将解决重定向问题。

您最初的问题是,当您使用未指定语言的 URL 调用它时,您的视图会返回“无法理解的响应”。这可能是因为视图检测到了错误的语言。就是 Django 检测语言偏好的方式。因此,如果 url 没有信息,它将:

  • 寻找语言 cookie。
  • 按此顺序查看 Accept-Language HTTP 标头。

因此,您可以确保您的 API 请求设置正确的标头(并且不发送语言 cookie),或者您可以只在 API 调用的每个视图中设置活动语言


推荐阅读