【问题标题】:"utf-8" encoding works on development server but not when deployed“utf-8”编码在开发服务器上有效,但在部署时无效
【发布时间】:2023-03-16 20:58:01
【问题描述】:

我在 pythonanywhere.com 上托管的 Django 应用程序不支持 utf-8 编码。 'é' 等字符返回错误。

观看次数

def result_view(request):
    if request.method == 'POST':
        search = request.POST.get('textfield').encode("utf-8")
        print search

        try:
            try:
                value = wikipedia.page(search)
                title = value.title
                url = value.url
                print title
                data = wikipedia.summary(search, sentences=10)

            except wikipedia.exceptions.DisambiguationError as e:
                data = e
                title = search + " (Disambiguation)"
                u = search.replace(" ", "_")
                url = "https://en.wikipedia.org/wiki/" + u

        except:
            raise Http404()

        return render(request, "search/result.html", {'title': title, 'url': url, 'data': data})

    else:
        return render(request, "search/result.html", {})

textfield 输入使用 utf-8 编码,在 Django 开发服务器中运行良好,但在我的 pythonanywhere 服务器中返回 404 页面。

模板

<form name="myform" method="POST" action="{% url 'result' %}">
    <div class="form-group">
        <div class="input-group">
            {% csrf_token %}
            <input type="text" class="form-control" name="textfield" placeholder="Search" required/>
            <div class="input-group-addon">
                <span class="glyphicon glyphicon-search"></span>

            </div>
        </div>
    </div>

    <button type="submit" class="btn btn-danger btn-lg ">Search</button>
</form> 

【问题讨论】:

  • 我相信你必须允许 Pythonanyhere 使用的数据库(它应该是 MySQL,但可能已经改变了)使用编码 utf-8。
  • 您的外部 try/except/404 正在吞噬真正的错误。摆脱它,看看日志中的实际回溯是什么?它可能与任何类型的数据库无关......

标签: python django encoding utf-8 pythonanywhere


【解决方案1】:

您必须允许 Pythonanyhere 使用的数据库(从 here 开始应该是 MySQL,但可以更改)使用编码 utf-8,为此,只需启动 MySQL 控制台,然后运行以下命令命令(当然,用您的数据库名称替换 databasename):

 ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_general_ci;

然后,为每个表运行:

 ALTER TABLE tablename CHARACTER SET utf8 COLLATE utf8_general_ci;

Utf-8 是用于在数据库中存储非拉丁字符(例如西里尔字母)的标准编码,然后您需要更改其字符集和排序规则设置,首先是在您的数据库上,然后是在每个表上。

如果您有很多表,您可以使用存储过程执行这些命令。

【讨论】:

  • 我相信这适用于数据库驱动的应用程序。我的应用程序不需要数据库。它只是通过 Wikipedia API 请求用户输入。因此,当用户输入具有特殊字符时,它在开发服务器中可以正常工作,但在生产服务器中却不行。
  • "在 Django 开发服务器中工作正常" 所以基本上你是说你取出字符串告诉 Django 使用什么数据库(默认情况下它的 SQLlite 实例)。此外,“我在 pythonanywhere.com 上托管的 Django 应用程序不支持 utf-8 编码”这与您的应用程序无关,而是您在哪里“托管它”,并且可能 100% 他们确实使用数据库,从链接来看它是一个 MYSQL例如,他们正式说明默认情况下数据库字符集的方式。数据存储在数据库中以保持持久性。顺便说一句,我试图有用,试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 2020-10-07
相关资源
最近更新 更多