forked from DemocracyClub/Website
-
Notifications
You must be signed in to change notification settings - Fork 0
/
zappa_commands.py
40 lines (28 loc) · 1.25 KB
/
zappa_commands.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
"""
Be in no doubt: this is a hack.
But why?
Well. AWS Lambda can 'invoke' functions directly or from a schedule. See
`events` in zappa_settings.json for more on them.
The problem is that django's management commands aren't exposed as functions,
they are intended to be run from the command line as an argument to
`manage.py`.
Also, invoke is meant to be passed a path to a callable that's then called.
This magic does a few things:
1. Turn the whole module in to a class. This is not recommended in normal use,
so don't get any ideas. This is what `sys.modules[__name__] = Runner()`
is doing.
2. Overwrite `__getattr__` on the class. This is also not recommended in normal
use. Remember this is now `__getattr__` on the *file* because the file is
the class.
3. For any attr, return a python lambda that when called will return a
function that can be called by AWS Lambda.
Due to AWS Lambda limitations, you can't pass arguments to the command at all.
Note: this is only intended for scheduled tasks. For running management
commands you should use `zappa manage`.
"""
class Runner:
def __getattr__(self, attr):
from django.core.management import call_command
return lambda: call_command(attr)
import sys
sys.modules[__name__] = Runner()