将 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_patterns
将 path('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.
我有一个包含网站和 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_patterns
将 path('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.