Miserlou / Zappa

Serverless Python
https://blog.zappa.io/
MIT License
11.89k stars 1.2k forks source link

Django management command with quoted argument #2139

Open ipmb opened 4 years ago

ipmb commented 4 years ago

Context

I'm trying to run:

zappa manage production 'shell -c "from django.contrib.auth import get_user_model; get_user_model().objects.create_superuser(username=\"admin\", password=\"changeme\")"'

Expected Behavior

It will invoke a command that is equivalent to:

manage.py shell -c "from django.contrib.auth import get_user_model; get_user_model().objects.create_superuser(username=\"admin\", password=\"changeme\")"

Actual Behavior

[START] RequestId: edf0eeda-879e-41ca-8595-e51a0adaee17 Version: $LATEST
[ERROR] CommandError: Error: unrecognized arguments: django.contrib.auth import get_user_model; get_user_model().objects.create_superuser(username="admin", password="changeme")\'
Traceback (most recent call last):
  File "/tmp/project/sentry_sdk/integrations/aws_lambda.py", line 57, in sentry_handler
    reraise(*exc_info)
  File "/tmp/project/sentry_sdk/_compat.py", line 57, in reraise
    raise value
  File "/tmp/project/sentry_sdk/integrations/aws_lambda.py", line 48, in sentry_handler
    return handler(event, context, *args, **kwargs)
  File "/var/task/handler.py", line 609, in lambda_handler
    return LambdaHandler.lambda_handler(event, context)
  File "/var/task/handler.py", line 243, in lambda_handler
    return handler.handler(event, context)
  File "/var/task/handler.py", line 408, in handler
    management.call_command(*event['manage'].split(' '))
  File "/tmp/project/django/core/management/__init__.py", line 147, in call_command
    defaults = parser.parse_args(args=parse_args)
  File "/tmp/project/django/core/management/base.py", line 55, in parse_args
    return super().parse_args(args, namespace)
  File "/var/lang/lib/python3.7/argparse.py", line 1758, in parse_args
    self.error(msg % ' '.join(argv))
  File "/tmp/project/django/core/management/base.py", line 61, in error
    raise CommandError("Error: %s" % message)

Possible Fix

I suspect the issue is here: https://github.com/Miserlou/Zappa/blob/0c8d99ddbc297124d93c166652013abba50ee86e/zappa/handler.py#L408

The code is simply splitting arguments by spaces where shlex.split might be more appropriate.

>>> manage = 'shell -c "from django.contrib.auth import get_user_model; get_user_model().objects.create_superuser(username=\\"admin\\", password=\\"changeme\\")"'
>>> manage.split(" ")
['shell', '-c', '"from', 'django.contrib.auth', 'import', 'get_user_model;', 'get_user_model().objects.create_superuser(username=\\"admin\\",', 'password=\\"changeme\\")"']
>>> import shlex
>>> shlex.split(manage)
['shell', '-c', 'from django.contrib.auth import get_user_model; get_user_model().objects.create_superuser(username="admin", password="changeme")']

Your Environment