Recently, there was a question on the Discord server about integrating Sanic handlers with Click.
Here is a rough estimation of what it could look like.
# clip.py
import asyncio
import click
import server # noqa
from handlers import handler
@click.command()
@click.option("--name", prompt="Your name", help="The person to greet.")
def hello(name):
response = asyncio.run(handler(None, name))
click.echo(response.body)
if __name__ == "__main__":
hello()
# handlers.py
from sanic import Sanic, text
app = Sanic.get_app()
@app.get("/<name>")
async def handler(request, name):
return text(f"Hello {name}")
# server.py
from sanic import Sanic
def create_app():
app = Sanic(__name__)
import handlers # noqa
return app
app = create_app()
With a setup like this, you could run this to get the server going:
sanic server:app
Or, this to hit the handler from CLI:
python cli.py
The important thing is to make sure that app.run()
is no in the global scope anywhere that cli.py
will run.