kubernetes 从应用内定期轮询Django DB-权限错误

e0uiprwp  于 2023-10-17  发布在  Kubernetes
关注(0)|答案(1)|浏览(140)

我想在我的Django应用程序数据库中记录一些“签到”事件。如果客户端/用户超过X分钟没有提交签入(通过HTTP请求到我的应用程序完成),那么我想向客户端发送一个socketIO消息。客户端可以发布一个检查,因为他们喜欢的频率。我从Kubernetes pod运行这个应用程序,数据库用户名和密码作为pod部署的环境变量导出。
我的解决方案是在应用程序启动时启动一个线程,并让这个线程每10分钟轮询一次Django数据库。如果在过去的10分钟内没有在数据库中找到签入记录,则调用我的套接字发射函数。否则,再睡10分钟。不幸的是,当我试图从线程中轮询数据库时,我遇到了:

django.db.utils.ProgrammingError: permission denied for table check_in_table

一些简化的代码片段:

# WatchCheckIn().start() is called from my apps.py file within my `AppConfig`'s `ready()`
class WatchCheckIn(threading.Thread):
    def run(self) -> None:
        logging.info('Querying database for check-ins.')
        try:
            latest_record = models.CheckIn.objects.last()
            check_in_period = datetime.datetime.now(
                tz=datetime.timezone.utc) - datetime.timedelta(minutes=10)
            if latest_record.check_in_time < check_in_period:
                socket_views.notify_need_check_in()
        except IndexError:
            logging.warning('No previous check-ins found.')
        finally:
            time.sleep(600)

在我的settings.py for my app中,我从作为K8s部署的一部分导出的内容中获取用户名和密码,正如我上面提到的:

DATABASES = {
    'default': {
        # <other items>
        'USER': os.environ.get('DB_USER'),
        'PASSWORD': os.environ.get('DB_PASSWORD'),
    }
}

我确实为我的应用程序提供了相应的models.pyviews.pyserializers.py文件,当客户端发出请求时,我可以很好地使用这些文件,但我不确定是否/如何在我自己的应用程序中使用这些文件。我通常只是困惑于如何给予我的应用程序以常规的节奏查询自己的数据库的权限。
我知道除此之外还有其他解决方案,比如celery ,但我真的很想看看这种方法是否可行。提前感谢任何帮助!

nhhxz33t

nhhxz33t1#

似乎此用户没有权限访问此check_in_table所在的数据库。
你能做到吗?在POD中执行并尝试从Django shell运行相同的SQL命令。没用的
然后使用psql命令,这样任何用户都可以访问数据库。你总是可以得到许可的但这似乎是根本原因

sudo -u postgres psql <database_name>
GRANT CREATE ON SCHEMA public TO <your_dbuser>;

你可以这样做来授予权限。
顺便说一句,这与Kubernetes无关。

相关问题