Template for running Python microservices
-
Extend the
semtech/mu-python-template
and set a maintainer. -
Configure your entrypoint through the environment variable
APP_ENTRYPOINT
(default:web.py
). -
Write the python requirements in a requirements.txt file. (Flask, SPARQLWrapper and rdflib are standard installed)
Create the entry point file and add methods with URL's. The flask app is added to the python builtin and can be accessed by using the app variable, as shown in following example:
@app.route("/exampleMethod")
def exampleMethod():
return example
FROM semtech/mu-python-template
MAINTAINER Sam Landuydt <[email protected]>
# ONBUILD of mu-python-template takes care of everything
The template supports the following environment variables:
-
MU_SPARQL_ENDPOINT
is used to configure the SPARQL endpoint.- By default this is set to
http://database:8890/sparql
. In that case the triple store used in the backend should be linked to the microservice container asdatabase
.
- By default this is set to
-
MU_APPLICATION_GRAPH
specifies the graph in the triple store the microservice will work in.- By default this is set to
http://mu.semte.ch/application
. The graph name can be used in the service viasettings.graph
.
- By default this is set to
-
MU_SPARQL_TIMEOUT
is used to configure the timeout (in seconds) for SPARQL queries.
To use the template while developing your app, start a container in development mode with your code folder on the host machine mounted in /app
:
docker run --volume /path/to/your/code:/app
-e MODE=development
-d semtech/mu-python-template
Code changes will be automatically picked up by Flask.
The template provides the user with several helper methods. Most helpers can be used by calling: "helpers.", except the sparql_escape helper: "sparql_escape(var)".
The template provides a log object to the user for logging. Just do log("Hello world"). The log level can be set through the LOG_LEVEL environment variable (default: info, values: debug, info, warning, error, critical).
Logs are written to the /logs directory in the docker container.
Generate a random UUID (String).
Get the session id from the HTTP request headers.
Get the rewrite URL from the HTTP request headers.
Validate whether the Content-Type header contains the JSONAPI Content-Type. Returns a 400 otherwise.
Validate whether the type specified in the JSON data is equal to the expected type. Returns a 409 otherwise.
Returns a JSONAPI compliant error response with the given status code (default: 400).
Executes the given SPARQL select/ask/construct query.
Executes the given SPARQL update query.
Executes a SPARQL query to update the modification date of the given subject URI (string). The date defaults to now.
This method can be used to avoid SPARQL injection by escaping user input while constructing a SPARQL query.
The method checks the type of the given variable and returns the correct object string format,
depending on the type of the object. Current supported variables are: datetime.time
, datetime.date
, str
, int
, float
and boolean
.
For example:
query = " INSERT DATA {"
query += " GRAPH <http://mu.semte.ch/application> {"
query += " < %s > a <foaf:Person> ;" % user_uri
query += " <foaf:name> %s ;" % sparql_escape(name)
query += " <dc:created> %s ." % sparql_escape(date)
query += " }"
query += " }"
Next to the sparql_escape
, the template also provides a helper function per datatype that takes any value as parameter. E.g. sparql_escape_uri("http://mu.semte.ch/application")
.
There is one example method in the template: GET /templateExample
. This method returns all triples in the triplestore from the SPARQL endpoint (beware for big databases!).