HTTP Methods
Auto-endpoints#
The default behavior is to automatically generate HEAD
endpoints for all GET
routes, and OPTIONS
endpoints for all
routes. Additionally, there is the option to automatically generate TRACE
endpoints. However, these are not enabled by
default.
HEAD#
- Configuration:
AUTO_HEAD
(defaultTrue
) - MDN: Read more
A HEAD
request provides the headers and an otherwise identical response to what a GET
request would provide.
However, it does not actually return the body.
@app.get("/")
async def hello_world(request):
return text("Hello, world.")
Given the above route definition, Sanic Extensions will enable HEAD
responses, as seen here.
$ curl localhost:8000 --head
HTTP/1.1 200 OK
access-control-allow-origin: *
content-length: 13
connection: keep-alive
content-type: text/plain; charset=utf-8
OPTIONS#
- Configuration:
AUTO_OPTIONS
(defaultTrue
) - MDN: Read more
OPTIONS
requests provide the recipient with details about how the client is allowed to communicate with a given
endpoint.
@app.get("/")
async def hello_world(request):
return text("Hello, world.")
Given the above route definition, Sanic Extensions will enable OPTIONS
responses, as seen here.
It is important to note that we also see access-control-allow-origins
in this example. This is because
the CORS protection is enabled by default.
$ curl localhost:8000 -X OPTIONS -i
HTTP/1.1 204 No Content
allow: GET,HEAD,OPTIONS
access-control-allow-origin: *
connection: keep-alive
Tip
Even though Sanic Extensions will setup these routes for you automatically, if you decide to manually create an @app.options
route, it will not be overridden.
TRACE#
- Configuration:
AUTO_TRACE
(defaultFalse
) - MDN: Read more
By default, TRACE
endpoints will not be automatically created. However, Sanic Extensions will allow you to
create them if you wanted. This is something that is not allowed in vanilla Sanic.
@app.route("/", methods=["trace"])
async def handler(request):
...
To enable auto-creation of these endpoints, you must first enable them when extending Sanic.
from sanic_ext import Extend, Config
app.extend(config=Config(http_auto_trace=True))
Now, assuming you have some endpoints setup, you can trace them as shown here:
$ curl localhost:8000 -X TRACE
TRACE / HTTP/1.1
Host: localhost:9999
User-Agent: curl/7.76.1
Accept: */*
Tip
Setting up AUTO_TRACE
can be super helpful, especially when your application is deployed behind a proxy since it will help you determine how the proxy is behaving.
Additional method support#
Vanilla Sanic allows you to build endpoints with the following HTTP methods:
See MDN Web Docs for more.
There are, however, two more "standard" HTTP methods: TRACE
and CONNECT
. Sanic Extensions will allow you to build
endpoints using these methods, which would otherwise not be allowed.
It is worth pointing out that this will NOT enable convenience methods: @app.trace
or @app.connect
. You need to
use @app.route
as shown in the example here.
@app.route("/", methods=["trace", "connect"])
async def handler(_):
return empty()