Routing¶
The Chalice.route()
method is used to construct which routes
you want to create for your API. The concept is the same
mechanism used by Flask and
bottle.
You decorate a function with @app.route(...)
, and whenever
a user requests that URL, the function you’ve decorated is called.
For example, suppose you deployed this app:
from chalice import Chalice
app = Chalice(app_name='helloworld')
@app.route('/')
def index():
return {'view': 'index'}
@app.route('/a')
def a():
return {'view': 'a'}
@app.route('/b')
def b():
return {'view': 'b'}
If you go to https://endpoint/
, the index()
function would be called.
If you went to https://endpoint/a
and https://endpoint/b
, then the
a()
and b()
function would be called, respectively.
Note
Do not end your route paths with a trailing slash. If you do this, the
chalice deploy
command will raise a validation error.
You can also create a route that captures part of the URL. This captured value will then be passed in as arguments to your view function:
from chalice import Chalice
app = Chalice(app_name='helloworld')
@app.route('/users/{name}')
def users(name):
return {'name': name}
If you then go to https://endpoint/users/james
, then the view function
will be called as: users('james')
. The parameters are passed as
keyword parameters based on the name as they appear in the URL. The argument
names for the view function must match the name of the captured
argument:
from chalice import Chalice
app = Chalice(app_name='helloworld')
@app.route('/a/{first}/b/{second}')
def users(first, second):
return {'first': first, 'second': second}
Other Request Metadata¶
The route path can only contain [a-zA-Z0-9._-]
chars and curly braces for
parts of the URL you want to capture. You do not need to model other parts of
the request you want to capture, including headers and query strings. Within
a view function, you can introspect the current request using the
app.current_request
attribute. This also
means you cannot control the routing based on query strings or headers.
Here’s an example for accessing query string data in a view function:
from chalice import Chalice
app = Chalice(app_name='helloworld')
@app.route('/users/{name}')
def users(name):
result = {'name': name}
if app.current_request.query_params.get('include-greeting') == 'true':
result['greeting'] = 'Hello, %s' % name
return result
In the function above, if the user provides a ?include-greeting=true
in the
HTTP request, then an additional greeting
key will be returned:
$ http https://endpoint/api/users/bob
{
"name": "bob"
}
$ http https://endpoint/api/users/bob?include-greeting=true
{
"greeting": "Hello, bob",
"name": "bob"
}