如何将 WSGI 中的首选编码设置为 UTF-8

2024-04-09

感觉这里有点疯狂。我已经使用 mod_wsgi 设置了 Apache,但我无法使编码正常工作。我有:

  • 测试 mod_wsgi 是否在守护进程模式下运行
  • read 格雷厄姆·邓普尔顿的博客文章 http://blog.dscpl.com.au/2014/09/setting-lang-and-lcall-when-using.html关于设置lang and locale设置为WSGIDaemonProcess指示。
  • 创建了一个似乎可以证明问题的最小测试
# I recompiled the mod_wsgi file to get the Python version correct
sys.version = '3.8.6 (default, Sep 24 2020, 21:54:23) \n[GCC 8.3.0]'
sys.prefix = '/usr/local'
sys.path = ['/usr/local/lib/python38.zip', '/usr/local/lib/python3.8', '/usr/local/lib/python3.8/lib-dynload', '/usr/local/lib/python3.8/site-packages', '/usr/local/src/scorched']

# This seems to be a timing thing? Not sure, but possibly problematic
locale.getlocale() = (None, None)
# This was fixed by setting lang or locale (not sure which)
locale.getdefaultlocale() = ('en_US', 'UTF-8')
sys.getdefaultencoding() = 'utf-8'

# These seem like a problem...
sys.getfilesystemencoding() = 'ascii'
locale.getpreferredencoding(False): 'ANSI_X3.4-1968'

# It's daemon mode
mod_wsgi.process_group = 'cl'

我的 WSGI 配置如下所示:

    WSGIScriptAlias / /opt/courtlistener/docker/apache/wsgi-configs/python_version_test.py
    WSGIDaemonProcess cl \
      threads=10 \
      processes=64 \
      python-path=/usr/local/lib/python3.8/site-packages/ \
      lang='en_US.UTF-8' \
      locale='en_US.UTF-8'
    WSGIProcessGroup cl
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On

当我登录服务器并启动时python在终端中,这条线工作正常,但是通过 mod_wsgi 运行时失败:

from reporters_db import REPORTERS

该行所做的只是导入一个 json 文件,其中包含一些 utf-8 内容。这是导入背后的代码:

db_root = os.path.dirname(os.path.realpath(__file__))
with open(os.path.join(db_root, "data", "reporters.json")) as f:
    REPORTERS = json.load(f, object_hook=datetime_parser)

由于上面的 json 调用没有指定编码,因此它使用 ASCII 并失败:

 Traceback (most recent call last):
   File "/opt/courtlistener/docker/apache/wsgi-configs/python_version_test.py", line 6, in <module>
     from reporters_db import REPORTERS
   File "/usr/local/lib/python3.8/site-packages/reporters_db/__init__.py", line 22, in <module>
     REPORTERS = json.load(f, object_hook=datetime_parser)
   File "/usr/local/lib/python3.8/json/__init__.py", line 293, in load
     return loads(fp.read(),
   File "/usr/local/lib/python3.8/encodings/ascii.py", line 26, in decode
     return codecs.ascii_decode(input, self.errors)[0]
 UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 441720: ordinal not in range(128)

我怎样才能告诉它(以及我的代码库的其余部分)像理智的成年人一样使用 utf-8 ?


Edit 1

也许值得一提的是我正在使用以下命令运行 apache:

exec apache2ctl -D FOREGROUND "$@"

我以为这会来源/etc/apache2/envvars文件,所以我将以下内容附加到该文件中:

export LANG="en_US.UTF-8"

我尝试将启动命令调整为:

LANG="en_US.UTF-8" exec apache2ctl -D FOREGROUND "$@"

我满怀希望,但没有。还是没有进展。


好吧,我通过搜索每次 Graham Dumpleton 在互联网上提到“lang”这个词的时间,终于弄清楚了这一点。最终出现了这个线程 https://groups.google.com/g/modwsgi/c/7qub8mWWDjQ?pli=1,其中提到可以不安装语言环境。我可以通过运行来检查locale -a在我的 Ubuntu Docker 镜像中,它显示:

locale -a
C
C.UTF-8
POSIX

所以这就是问题所在!mod_wsgi当我要求时不知道我在要求什么en_US.utf-8,并且它也不会抛出错误。将我的设置改为C.UTF-8立即修复此问题。

我正在运行一个精简的 docker 映像,所以这一定是我缺少语言环境的原因。我也没有文件/etc/default/locale这个一般领域的许多其他答案都提到了。

我已将其归档为a bug https://github.com/GrahamDumpleton/mod_wsgi/issues/625.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 WSGI 中的首选编码设置为 UTF-8 的相关文章

随机推荐

  • 在 Android 设备中使用 ACTION_PICK 意图仅显示电话号码联系人

    我的目标是仅向用户显示带有电话号码的联系人 并让用户选择我想在本地存储的几个联系人 我在下面的方法中使用了各种选项来代替 ContactsContract Contacts CONTENT URI 但我收到了很多显示的联系人 许多都是垃圾邮
  • 查找 Java 类文件版本之间的差异

    我正在使用来自商业供应商的大型 Java Web 应用程序 我从供应商那里收到了一个新的 class 文件形式的补丁 该文件应该可以解决我们在软件方面遇到的问题 过去 应用该供应商的补丁会导致出现新的且完全不相关的问题 因此我想在将其应用于
  • 使用端点原型数据存储时设置父键但不设置子键

    如何为 EndpointsModel 设置父级 祖先并让数据存储区自动生成实体 ID 密钥 我已经尝试去适应带有祖先的键 http endpoints proto datastore appspot com examples keys wi
  • Lighttable,设置字体大小

    我是 Light Table IDEAS 的新手 有谁知道如何设置workspace和 Windows 字体大小 我可以更改编辑器字体大小 但不知道如何设置font size对于其他元素 或者更改所有 IDE 字体的全局字体大小 打开命令窗
  • DateTime.TryParseExact 未按预期工作

    谁能解释为什么以下代码片段返回 true 根据文档 d 自定义格式说明符 http msdn microsoft com en us library 8kb3ddd4 aspx dSpecifier 一位数日期的格式不带前导零 那么 当我给
  • Pyparsing - 匹配最外面的一组嵌套括号

    我正在尝试使用 pyparsing 构建一个解析器 该解析器将匹配任意嵌套的括号内的所有文本 如果我们考虑这样的字符串 A B C D E F G Random Middle text H I J 我想要的是解析器以返回两个匹配的方式进行匹
  • 地图在移动设备上显示错误(使用 JQuery mobile)

    我正在使用 jQuery mobile 并且必须显示一些地图 我使用的功能是每次单击特定链接时都会创建地图 但在生成第一个地图后 其他地图显示错误 这里有一个例子 第一张地图 其他地图 我使用这样的函数 function buildMap
  • 使用 EVAL、SCAN 和 DEL 的 Redis 通配符删除脚本返回“非确定性命令后不允许写入命令”

    因此 我正在寻求构建一个 lua 脚本 该脚本使用 SCAN 根据模式查找键并删除它们 原子地 我首先准备了以下脚本 local keys local done false local cursor 0 repeat local resul
  • gridview中如何合并两个单元格

    我在 gridview 中有一些数据 格式如下 A B 1 2 adeel 3 4 sml 现在我想将该行与 B 列下的空单元格合并 我该怎么做 您可以使用 layout columnSpan 或 layout rowSpan 根据需要使对
  • ExpandableListView、OnChildClickListener

    我有组列表 每个组内都有填充的子项目 我已经实现了searchview with filtered ressults and myExpandableListView 可以展开和折叠 问题是 我不知道如何处理 OnChildClickLis
  • 为什么数字类型不共享通用接口?

    我最近遇到了一个问题 我想要一个可以同时处理双精度和整数的函数 并且想知道为什么所有数字类型 包含算术运算符和比较 没有通用接口 它会让编写像这样的函数Math Min 存在无数的重载 方式更方便 引入额外的接口会是一个重大改变吗 Edit
  • 如何使用POI api读取java中的doc和docx文件

    我正在尝试读取 doc 和 docx 文件 这是代码 static String distination E static String docFileName Requirements docx public static void ma
  • 使用固定导航栏和锚标记跳转到部分的引导程序[重复]

    这个问题已经存在了 我正在尝试使用锚标记通过引导程序和固定在顶部的导航栏导航到网页的特定部分 问题是 当我单击锚链接时 它们无法正确滚动到该部分的开头 而是滚动到该部分的开头 因为页边距应用于正文 body margin top 60px
  • X.iOS Cycle7 似乎破坏了 SSL

    昨天我在 Beta 通道中将 XS 更新为 RC 版本 即 Cycle7 现在我在使用 iOS 连接到 HTTPS 连接时遇到问题 错误 Error SecureChannelFailure The authentication or de
  • 如何使用musicbrainz获取专辑图像

    我不知道我是否可以在这里问这样的问题 我的问题如下 我正在自己制作音乐播放器 我想下载那些没有专辑图像的歌曲的专辑图像 就像什么是在做 我自己做了一些搜索 我发现使用 MusicBrainz 我们可以下载图像 我查了一下它的API 但我不太
  • 使用 php 删除 xml 中标签值之间的空格

    我一直在搜索信息 当我将 PHP 代码导出到 XML 时 如何删除 PHP 代码留下的标记值之间的空格 我将详细解释 首先加载 XML 然后使用 xPath 对文件进行搜索 然后删除一些元素与某些品牌不匹配 最后我将其重新导出为新的 XML
  • numpy正半定警告

    在我正在编写的Python脚本中 我正在使用表达式模拟多元正态随机向量 np random multivariate normal np zeros dim obs y cov 我的脚本运行 但生成以下警告 RuntimeWarning c
  • html5/jquery后退按钮

    是否有一个库或一段代码可以使特定按钮充当正确的浏览器后退按钮 它将带您到之前加载的上一个页面 目前我只是指定href我假设的是之前加载的页面 但得出的结论是这不起作用 因为可以从不同的屏幕访问一个屏幕 是否有这样的示例 或者我是否需要创建自
  • Android:从另一个片段打开一个片段

    我是 Android 新手 这是我的第二个应用程序 我正在创建一个选项卡式活动 其中第一个片段具有用于创建新任务的表单 第二个片段具有所有已保存任务的列表 第三个片段将在从第二个片段的列表中选择时显示对任务的评论分段 第三个片段也应该像一个
  • 如何将 WSGI 中的首选编码设置为 UTF-8

    感觉这里有点疯狂 我已经使用 mod wsgi 设置了 Apache 但我无法使编码正常工作 我有 测试 mod wsgi 是否在守护进程模式下运行 read 格雷厄姆 邓普尔顿的博客文章 http blog dscpl com au 20