无法通过container命令或www.example.com在aws beanstalk中创建django超级用户manage.py

zynd9foi  于 2023-01-21  发布在  Go
关注(0)|答案(6)|浏览(106)

我已经陷入了一个瓶颈,我试图解决使用官方文档和其他答案在stackoverflow这里,但仍然不能创建django超级用户在beanstalk环境编程。
当前状态- A。应用程序正在顺利部署,我能够从我的UI应用程序访问数据库。基本上,该条目是在其他一些表中,我在应用程序中。
我是如何创造超级用户的-
a.借传递容器命令─
选择1-

container_commands:
  01_migrate:
    command: "django-admin.py migrate"
    leader_only: true
  02_collectstatic:
    command: "django-admin.py collectstatic --noinput"

commands:
  super_user:
    command: "source /opt/python/run/venv/bin/activate && python <appname>/createuser.py"
    leader_only: true

  option_settings:
  "aws:elasticbeanstalk:application:environment":
    DJANGO_SETTINGS_MODULE: "<Appname>.settings"
    PYTHONPATH: "/opt/python/current/app:$PYTHONPATH"

在日志中-我没有看到它试图运行自定义命令。
备选方案2 -

container_commands:
  01_migrate:
    command: "django-admin.py migrate"
    leader_only: true
  02_collectstatic:
    command: "django-admin.py collectstatic --noinput"
  03_createsuperuser:
    command: "source /opt/python/run/venv/bin/activate && django-admin.py createsuperuser"

  option_settings:
  "aws:elasticbeanstalk:application:environment":
    DJANGO_SETTINGS_MODULE: "<appname>.settings"
    PYTHONPATH: "/opt/python/current/app:$PYTHONPATH"

为此,我createsuperuser.py在/management/commands/下创建了一个www.example.com文件,在两个文件夹中遵循init.py的结构,并在以下命令下创建了一个createsuperuser.py-

from django.core.management.base import BaseCommand
from django.contrib.auth.models import User

class Command(BaseCommand):

   def handle(self, *args, **options):
      if not User.objects.filter(username="admin").exists():
          User.objects.create_superuser("admin", "admin@gmail.com", "admin")

关于这个,我从日志中得到了以下信息-

Superuser creation skipped due to not running in a TTY. You can run `manage.py createsuperuser` in your project to create one manually.

我的问题是-
1.为什么我不能从我的虚拟环境的命令行创建一个超级用户?因为我收到这样的消息-
raise配置不正确(“设置.数据库配置不正确.“django.core.exceptions.配置不正确:设置。DATABASE配置不正确。请提供ENGINE值。有关详细信息,请查看设置文档。
考虑到makemigrations命令工作正常,有点奇怪。
当我回显$DJANGO_SETTINGS_MODULE时,我得到了正确的设置
appname.settings
让我知道我在创建超级用户的事情上哪里出错了?

olmpazwi

olmpazwi1#

我最近用beanstalk中的一个示例应用程序部署解决了这个问题。
1.在你的django应用文件夹中创建python包'management'
1.在管理包“commands”中创建另一个包
1.在命令包www.example.com中创建python文件mysuperuser.py

import os
from django.core.management.base import BaseCommand
from django.contrib.auth.models import User

class Command(BaseCommand):
    def handle(self, *args, **options):
        if not User.objects.filter(username='myuser').exists():
            User.objects.create_superuser('myuser',
                                          'myuser@myemail.com',
                                          'mypassword')

1.在django-migrate.config文件中,添加第二个命令
02_create_superuser_for_django_admin: command: "python manage.py mysuperuser" leader_only: true
1.做pythonmanage.py收集静态和eb部署.
这样做为我创建了一个超级用户,我不需要添加任何PYTHONPATH,就像网上一些答案中描述的那样。

g2ieeal7

g2ieeal72#

您的自定义文件名为“createsuperuser.py“,与Django命令相同,冲突就是导致问题的原因。使用“createsu.py“作为文件名,然后确保更改配置文件也使用“createsu”。

hsgswve4

hsgswve43#

我花了很长时间来研究如何做到这一点,这是迄今为止最简单和最安全的方法。创建以下文件***.platform〉hooks〉postdeploy〉01_migrate.sh***并输入以下内容:

#!/bin/bash

source /var/app/venv/*/bin/activate && { python migrate.py createsuperuser --noinput; }

然后,您可以将DJANGO_SUPERUSER_PASSWORDDJANGO_SUPERUSER_USERNAMEDJANGO_SUPERUSER_EMAIL添加到应用程序环境的配置部分,它将知道我们指定--noinput时要使用这些配置。
然后添加下面的文件夹***. ebextensions〉django.config***.这只是解决了运行01_migrate.sh时的权限问题

container_commands:
    01_chmod1:
         command: "chmod +x .platform/hooks/postdeploy/01_migrate.sh"

这将以一种安全的方式创建您的超级用户,使用相同的逻辑,您还可以运行迁移并通过添加到01_migrate.sh文件来收集静态数据。

sxissh06

sxissh064#

我有一个@jimbo的答案的简单版本,在.ebextensions/db-migrate.config中我有以下代码:

container_commands:
  01_migrate:
    command: "source /var/app/venv/*/bin/activate && python3 manage.py migrate"
    leader_only: true
  02_createsuperuser:
    command: "source /var/app/venv/*/bin/activate && python3 manage.py createsuperuser --noinput"
    leader_only: true
option_settings:
  aws:elasticbeanstalk:application:environment:
    DJANGO_SETTINGS_MODULE: <appname>.settings

其中的关键行是02_createsuperuser容器命令。获得该命令后,您可以在环境中设置DJANGO_SUPERUSER_PASSWORDDJANGO_SUPERUSER_USERNAMEDJANGO_SUPERUSER_EMAIL环境变量,然后进行部署。创建用户后,删除该容器命令,这样它就不会在下一次部署中再次运行。

jexiocij

jexiocij5#

deepesh和jimbos组合解决方案为我做到了。
如果您有一个自定义用户,则此选项特别有用。
我会把步骤写下来。
1在management/command下创建命令文件,不要命名为createsuperuser.py,避免冲突。

└-- App_dir
    └-- management
        |-- __init__.py
        └-- commands
            |-- __init__.py
            └-- createsu.py

2命令文件应如下所示。

import os
from django.contrib.auth.models import User
from django.core.management.base import BaseCommand

class Command(BaseCommand):
    help = "Creates a superuser."

    def handle(self, *args, **options):
        if not User.objects.filter(username="username").exists():
            password = os.environ.get("SUPERUSER_PASSWORD")
            if password is None:
                raise ValueError("Password not found")
            User.objects.create_superuser(
                username="username",
                email="email", 
                password=password,
            )
            print("Superuser has been created.")
        else:
            print("Superuser exists")

3在环境〉配置〉软件〉环境属性中添加SUPERUSER_PASSWORD
4提交和eb部署。
我们仍然在存储原始密码,这不是世界上最安全的事情。但是它比在命令文件中硬编码密码安全得多。

kmpatx3s

kmpatx3s6#

在用户无法输入信息的情况下,不能使用创建超级用户。请参阅https://realpython.com/blog/python/deploying-a-django-app-to-aws-elastic-beanstalk/#Create.the.Admin.User了解其他方法。

相关问题