【问题标题】:URL quote PostgreSQL database password in DjangoURL 引用 Django 中的 PostgreSQL 数据库密码
【发布时间】:2016-05-29 12:04:54
【问题描述】:

我在使用http://cookiecutter-django.readthedocs.org/en/latest/ 创建的项目中使用 Django 1.9.2 和 psyopg2 2.6.1 和 Python 3.5.0。我有一个如下所示的数据库配置:

import environ
from django.utils.http import urlquote
env = environ.Env()

DATABASES = {
    # 1) This does not work.
    # 'default': env.db("DATABASE_URL",
    #                   default="postgres://myuser:%s@127.0.0.1:5432/mydb" % "1234#abc")
    # 2) This does not work.
    # 'default': env.db("DATABASE_URL",
    #                   default="postgres://myuser:%s@127.0.0.1:5432/mydb" % urlquote("1234#abc"))

    # 3) This works 
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'mydb',
        'USER': 'myuser',
        'PASSWORD': '1234#abc',
        'PORT': 5432,
        'HOST': '127.0.0.1'
    }
}

我的数据库密码中有一个#。我可以使用选项 #3 选项成功连接,但使用其他两个选项时收到以下错误:

1) ValueError: invalid literal for int() with base 10: '1234'

2)django.db.utils.OperationalError: FATAL: password authentication failed for user "myuser"

如何正确将此密码与# 一起发送到 PostgreSQL?

【问题讨论】:

  • urlquote('1234#abc') 将返回 1234%23abc,这显然与您的数据库密码不匹配。
  • @xyres 我已更新问题以使我的问题更清楚。
  • It's a bug。 django-environ 库的作者已经发了pull request 来修复这个bug,但仍然没有合并它。

标签: python django postgresql


【解决方案1】:

尝试将其编码为原始字符串,即在您的情况下:

 'default': env.db("DATABASE_URL",
    default="postgres://myuser:%s@127.0.0.1:5432/mydb" % r"1234#abc")

发回你的结果。

【讨论】:

    猜你喜欢
    • 2021-08-12
    • 2023-03-11
    • 2020-04-06
    • 2011-12-30
    • 1970-01-01
    • 2016-02-13
    • 2016-12-04
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多