【问题标题】:File encoding on Django deployed serverDjango 部署服务器上的文件编码
【发布时间】:2018-09-06 00:45:27
【问题描述】:

我最近将我的 Django 应用程序部署到了预设的托管服务器(Red Hat),并且在上传包含西里尔文符号(具体来说是俄语)但保存 CharFields 的图片后短暂使用后出现 UnicodeEncode 错误俄语中的数据工作得很好。

但是,相同的代码在我的个人计算机上运行没有缺陷(在 Ubuntu 和 Windows 上测试)。在服务器上进行文件编码检查后发现,主机上的默认系统编码是 ANSI,它是 ASCII 的扩展

此时,我联系了技术支持,他们声称这可能是 Django 故障,因为他们在服务器上使用 UTF-8 编码(那么 sys.getfilesystemencoding() 展示,从操作系统编码继承的是 ASCII? )

我的另一个怀疑是语言环境混乱

事实证明这是真的。

无论如何,有没有什么办法可以证明这是 Django 的错,可以通过 Python/Django hacks 修复,还是完全是服务器的错?

编辑:需要明确的是,这不是 VDS,这只是带有预设配置的常规托管,所以我无法完全控制环境设置,但是,我可以配置 .htaccess 文件和 .fcgi 脚本,所以我相信它是阿帕奇服务器

【问题讨论】:

    标签: python django unicode locale file-encodings


    【解决方案1】:

    我在生产服务器上遇到了同样的问题。重要的是使用正确的编码部署您的 django 应用程序。

    我使用 gunicorn 进行部署并通过主管运行 gunicorn。在主管配置中,我定义了编码:

    这是我的 django 应用程序的主管配置文件:

    [program:django_app]
    command = /path/to/gunicorn/start/file                 ; Command to start app
    user = matyas                                                     ; User to run as
    stdout_logfile = /././logs/gunicorn_supervisor.log     ; Where to write log messages
    redirect_stderr = true                                            ; Save stderr in the same log
    environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8                   ; Set UTF-8 as default encoding
    

    一行

    environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8  
    

    是重要的声明。如果您不使用主管,请确保将此语言参数传递给在您的服务器上启动 django 应用程序的命令。

    【讨论】:

      【解决方案2】:

      我已联系技术支持,他们声称 (...) 他们在服务器上使用 UTF-8 编码

      这个断言充其量是值得商榷的。

      在 linux 系统上,文件名编码不是在文件系统级别全局设置的,而是取决于环境 - 通常为每个用户设置,但可以在执行命令之前覆盖。

      IOW,您的 django 应用程序的有效 fs 编码取决于启动 django 进程的进程(apache、gunicorn 等)的环境,并且您在自己的 python shell 中找到的值可能不是您看到的那个django。你没有提到你是如何运行你的 django 应用程序的,所以 atm 不可能告诉你确切的位置,但至少上述信息应该为你指明正确的方向。

      不管怎样,有什么办法是 Django 的错

      完全废话。

      它可以通过 Python/Django hacks 修复

      绝对不是。正确的解决方案是修复进程环境,期间。

      【讨论】:

      • 我正在使用常规托管(因为客户的预算和需求 VDS 将是多余的 + 说托管已经提前 2 年支付)并且它已经有预设的使用环境 - 唯一我必须配置的是 fcgi 脚本和 .htaccess 文件,所以我相信它是 Apache 服务器。谢谢你的回答,我需要一个证明,这是环境错误,Python/Django 不可能
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 2018-12-30
      • 2019-05-12
      • 2018-10-11
      相关资源
      最近更新 更多