【问题标题】:Django: Accented characters in settings.py are broken when accessed in a viewDjango:在视图中访问时,settings.py 中的重音字符被破坏
【发布时间】:2012-06-01 19:26:00
【问题描述】:

我的 settings.py 中有重音字符,我使用 getattr(settings, 'MY_CONSTANT_NAME', []) 在视图中访问这些字符,但 getattr() 调用返回损坏的字符(例如,“ô”变为:“\ xc3\xb4")。

这是 view.py 中的代码:

    from django.conf import settings

    def getValueFromSetting(request):
        mimetype = 'application/json' 
        charset=utf-8' datasources = getattr(settings, 'MY_CONSTANT_NAME', []) 
        config= '{' 
        config+= '"datasources": ' + str(datasources).replace("'", '"') 
        config+= '}'

        return HttpResponse(config,mimetype)                      

到目前为止我为解决问题所做的工作:

  • 我把 # -- coding: utf-8 -- 作为我的 settings.py 和 my views.py 的第一行
  • 我将 u'ô' 或 unicode('ô') 放在 settings.py 中特殊字符的前面
  • 我将 DEFAULT_CHARSET = 'utf-8' 放在 settings.py 中
  • 我尝试了所有可能的 .decode('utf-8')、.encode('utf-8')、.decode('iso-8859-1')、.encode('iso-8859-1 ') 在 settings.py 或 views.py 中的特殊字符上...

没有什么能解决问题。

有解决这个问题的建议吗?

谢谢

艾蒂安

【问题讨论】:

  • 那么您究竟在哪里看到了这个“损坏”的输出?事实上,这对我来说看起来完全正确,但没关系。你是如何输出这个值的?

标签: django unicode encoding character-encoding


【解决方案1】:

我假设您在浏览器中看到了这些 \xc3\xb4 字符串。您是否尝试过编辑模板文件以在 HTML 标头中定义正确的字符集?

<head>
  <meta name="description" content="example" />
  <meta name="keywords" content="something" />
  <meta name="author" content="Etienne" />
  <meta charset="UTF-8" />      <!--  <---- This line -->
</head>

在您对此答案的第一条评论后进行编辑:

我怀疑getattr 除了ascii 编码之外将无法使用。你认为像下面这样的东西不会做你想做的事吗?

from django.conf import settings

def getValueFromSetting(request):
    myConstantValue = settings.MY_CONSTANT_NAME
    # check myConstantValue here

在最后一个 cmets 之后编辑:

我想现在我明白你的问题了。您不喜欢视图返回的 JSON 仅为 ASCII 的事实。我建议你使用 Python 捆绑的json 模块提供的dumps 函数。这是一个例子:

# -*- coding: utf-8 -*-
# other required imports here
import json

def dumpjson(request):
   response = HttpResponse(json.dumps(settings.CONSTANT_TUPLE, encoding='utf-8', ensure_ascii=False), content_type='application/json')

   return response

示例中的CONSTANT_TUPLE 只是我的settings.pyDATABASES 的副本。

这里重要的是ensure_ascii=False。你能试试吗?这就是你想要的吗?

【讨论】:

  • 我在将这些字符串发送到浏览器之前看到了这些字符串......我在调试时直接在我的视图中看到了它(在 Aptana Studio 中)......我在浏览器中也看到了相同的行为,即使放了
  • 我只是试了一下,我使用 myConstantValue = settings.MY_CONSTANT_NAME 而不是调用 getattr 时遇到了相同的字符集问题...
  • 你能多展示一些你的代码吗?在那个视图中,你对myConstantValue 做了什么?模板呢?
  • 我的目标是从 settings.py 中获取这个常量,并将其以 JSON 格式返回给来自 Javascript 的 Ajax 调用。该常量包含一个字典列表。
  • 更新原始问题中的代码块会更容易阅读。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 2020-08-19
  • 2016-11-03
  • 2016-08-03
  • 1970-01-01
  • 2017-09-03
  • 2020-07-20
相关资源
最近更新 更多