将 i18n_patterns 与 API 一起使用时出现问题

Issue using i18n_patterns with API

我有一个包含网站和 API 的应用程序。我已将网站翻译成第二语言。目前主要语言是英语,第二种是波斯语。我在 urlpatterns 中使用 i18n_patterns 在两种语言之间重定向。 问题是 使用 API 时,似乎 Django 重定向了我的请求,因为数据是使用 POST 发送的,它会丢弃所有数据并给我一个使用 GET 的空结果。我尝试从 url 模式中取出 API url 然后附加它来解决这个问题,但这不起作用,因为我需要波斯语的 Unicode 支持,因为那里没有 i18n_patterns 支持这种方式,我得到一个难以理解的响应。
这是网址模式:

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/。如果我使用 i18n_patternspath('api/', include('mainapp.api.urls')) 添加到原始 url 模式,并将请求发送到 API,则 request.POST 值为 <QueryDict: {}> 而否则它应该发送一个 key:value 到后端。我环顾四周,似乎当您将 i18n_patterns 添加到 url 模式时,会发生重定向,并且由于 HTTP 不允许 POST 数据重定向,我得到一个空响应。

不确定我是否完全理解您的问题,但您可以通过在 CMS_LANGUAGES 设置中将 redirect_on_fallback 设置为 False 来阻止重定向。

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

因为 API 不会向 end-users 显示 URL,因此 API url 就没有意义属于 i18n_patterns。这将解决重定向问题。

您最初的问题是,当您使用未指定语言的 URL 调用它时,您的视图 returns 是 "unintelligible response"。这可能是因为视图检测到错误的语言。 This 是 Django 检测语言偏好的方式。因此,如果 url 没有信息,它将:

  • 查找语言 cookie。
  • 按顺序查看 Accept-Language HTTP header。

因此您可以确保您的 API 请求设置正确的 header(并且不发送语言 cookie),或者您可以 set the active language 在调用的每个视图中API.