Django 1.11无法连接到RDS上的Postgres

时间:2017-06-10 17:40:19

标签: python django postgresql amazon-ec2

我在RDS上使用Postgres创建了一个新的EC2实例。我确认我可以使用psql从EC2实例连接到数据库,没有任何问题,这意味着我的安全设置没问题。

然而,当我尝试运行manage.py runservermanage.py dbshell(来自virtualenv)时,Django会挂起,然后最终会出现超时错误:

  

psql:无法连接到服务器:连接超时是服务器   在主机上运行" whatever.rds.amazonaws.com"   (172.xxx.xxx.xxx)并接受端口5342上的TCP / IP连接?

     

回溯(最近一次呼叫最后一次):文件" manage.py",第22行,in          execute_from_command_line(sys.argv)File" /home/ubuntu/Env/xxxx/lib/python3.5/site-packages/django/core/management/ init .py",   第363行,在execute_from_command_line中       utility.execute()

     

文件" /home/ubuntu/Env/ss2017/lib/python3.5/site-packages/django/core/management/ init .py",   第355行,执行中       self.fetch_command(子命令).run_from_argv(self.argv)

     

File" /home/ubuntu/Env/ss2017/lib/python3.5/site-packages/django/core/management/base.py",   第283行,在run_from_argv中       self.execute(* args,** cmd_options)

     

File" /home/ubuntu/Env/ss2017/lib/python3.5/site-packages/django/core/management/base.py",   第330行,执行中       output = self.handle(* args,** options)

     

文件" /home/ubuntu/Env/ss2017/lib/python3.5/site-packages/django/core/management/commands/dbshel​​l.py",   第22行,处理中       connection.client.runshell()

     

File" /home/ubuntu/Env/ss2017/lib/python3.5/site-packages/django/db/backends/postgresql/client.py",   第66行,在runhell中       DatabaseClient.runshell_db(self.connection.get_connection_params())

     

File" /home/ubuntu/Env/ss2017/lib/python3.5/site-packages/django/db/backends/postgresql/client.py",   第58行,在runshell_db中       subprocess.check_call(args)

     

文件" /usr/lib/python3.5/subprocess.py",第581行,在check_call中       引发CalledProcessError(retcode,cmd)subprocess.CalledProcessError:Command' [' psql',' -U',' db_name',   ' -h',' whatever.rds.amazonaws.com',' -p',' 5342',' user_name&# 39;]'   返回非零退出状态2

我尝试创建Django应用程序的新副本以查看是否涉及到损坏的文件,并且我对settings.py文件进行了一些更改,但没有运气。

有什么想法吗?

修改

Settings.py(重要位)

DEBUG = False

ALLOWED_HOSTS = ['localhost', '0.0.0.0', '127.0.0.1', 'compute.amazonaws.com']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'database_name',
        'USER': 'xxxxxxxx',
        'PASSWORD': 'xxxxxxxx',
        'HOST': 'whatever.us-west-2.rds.amazonaws.com',
        'PORT': '5342',
    }
}

2 个答案:

答案 0 :(得分:0)

我最终在EC2服务器上创建了一个本地postgres数据库,以查看是否出现任何错误。当我尝试运行makemigrationsmigrate来设置数据库时,我得到了一个"关系不存在"错误。堆栈跟踪指向我的一个视图中的一行,看起来像这样:

some_queryset = Model.objects.all()
some_queryset.delete() # <--- this line was the problem

尽管从技术上讲这是删除给定表中所有条目的可接受方式,但Django(在服务器上)并不喜欢给定模型的关系不存在这一事实。

我对该行进行了注释,并且能够毫无问题地连接到数据库。

因此对于未来的读者 - 如果您的Django应用程序挂起runserver,但您可以从EC2实例访问RDS数据库,请尝试设置本地数据库以检查是否存在任何问题。

答案 1 :(得分:0)

exit status 2通常意味着您使用错误的参数调用了psql。对我来说,psql身份验证错误也触发了此退出代码。我的问题最终成为settings.DATABASES['default']正在使用的DBPASSWORD环境变量中的拼写错误。