Adds the additional dependency to sanic-cors for the Sanic server.
if: matrix.flavour == 'oldstuff'
- name: Install Python webservers
- run: pip3 install falcon sanic sanic-testing starlette
+ run: pip3 install falcon sanic sanic-testing sanic-cors starlette
- name: Install latest pylint/mypy
run: pip3 install -U pylint mypy types-PyYAML types-jinja2 types-psycopg2 types-psutil types-requests typing-extensions asgi_lifespan sqlalchemy2-stubs
[mypy]
plugins = sqlalchemy.ext.mypy.plugin
+[mypy-sanic_cors.*]
+ignore_missing_imports = True
+
[mypy-icu.*]
ignore_missing_imports = True
* one of the following web frameworks:
* [falcon](https://falconframework.org/) (3.0+)
- * [sanic](https://sanic.dev)
+ * [sanic](https://sanic.dev) and (optionally) [sanic-cors](https://github.com/ashleysommer/sanic-cors)
* [starlette](https://www.starlette.io/)
* [uvicorn](https://www.uvicorn.org/) (only with falcon and starlette framworks)
server_module = importlib.import_module('nominatim.server.sanic.server')
app = server_module.get_application(args.project_dir)
- app.run(host=host, port=port, debug=True)
+ app.run(host=host, port=port, debug=True, single_process=True)
else:
import uvicorn # pylint: disable=import-outside-toplevel
"""
api = NominatimAPIAsync(project_dir, environ)
- app = App()
+ app = App(cors_enable=api.config.get_bool('CORS_NOACCESSCONTROL'))
for name, func in api_impl.ROUTES:
app.add_route('/' + name, EndpointWrapper(func, api))
app.ctx.api = NominatimAPIAsync(project_dir, environ)
+ if app.ctx.api.config.get_bool('CORS_NOACCESSCONTROL'):
+ from sanic_cors import CORS # pylint: disable=import-outside-toplevel
+ CORS(app)
+
for name, func in api_impl.ROUTES:
app.add_route(_wrap_endpoint(func), f"/{name}", name=f"v1_{name}_simple")
from starlette.exceptions import HTTPException
from starlette.responses import Response
from starlette.requests import Request
+from starlette.middleware import Middleware
+from starlette.middleware.cors import CORSMiddleware
+from nominatim.config import Configuration
from nominatim.api import NominatimAPIAsync
import nominatim.api.v1 as api_impl
environ: Optional[Mapping[str, str]] = None) -> Starlette:
""" Create a Nominatim falcon ASGI application.
"""
+ config = Configuration(project_dir, environ)
+
routes = []
for name, func in api_impl.ROUTES:
routes.append(Route(f"/{name}", endpoint=_wrap_endpoint(func)))
- app = Starlette(debug=True, routes=routes)
+ middleware = []
+ if config.get_bool('CORS_NOACCESSCONTROL'):
+ middleware.append(Middleware(CORSMiddleware, allow_origins=['*']))
+
+ app = Starlette(debug=True, routes=routes, middleware=middleware)
app.state.API = NominatimAPIAsync(project_dir, environ)