django - 将 i18n_patterns 与 API 一起使用的问题
问题描述
我有一个包含网站和 API 的应用程序。我已将网站翻译成第二语言。目前主要语言是英语,其次是波斯语。我已经习惯i18n_patterns
在urlpatterns
两种语言之间进行重定向。
问题是在使用 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 数据重定向,我得到一个空响应。
解决方案
的目标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 调用的每个视图中设置活动语言。
推荐阅读
- angular - 将日期修复到 ng-pick-datetime 中的特定时区
- scala - 关于在scala中表达的简单模式的非法开始
- google-people-api - 如何只获取真实的联系人照片?
- jquery - JQuery 使用 For 更改同一 HTML 表格单元格上的值
- reactjs - 任务 :app:transformNativeLibsWithMergeJniLibsForDebug 失败
- animation - 使用图像文件而不是 SVG 为书法制作动画
- spring - 如何从弹簧过滤器返回响应为 Json?
- python - 调用 logging.getLogger(__name__) logger.handlers 后的烧瓶丢失
- ruby-on-rails - 从通过 API 在 Rails 中传递的 JSON 创建嵌套属性
- regex - 如何在 Python 中找到一个包含(和不)环绕某个模式的字符串?