]> git.openstreetmap.org Git - nominatim.git/blobdiff - nominatim/cli.py
add sanic development server implementation
[nominatim.git] / nominatim / cli.py
index 56ed6a078eb3a082f9430564b279b1470348c89e..c134ca1808c2a2fe7267fc26947c54931bb23ab7 100644 (file)
@@ -197,10 +197,15 @@ class AdminServe:
     """\
     Start a simple web server for serving the API.
 
-    This command starts the built-in PHP webserver to serve the website
+    This command starts a built-in webserver to serve the website
     from the current project directory. This webserver is only suitable
     for testing and development. Do not use it in production setups!
 
+    There are different webservers available. The default 'php' engine
+    runs the classic PHP frontend. 'sanic' and 'falcon' are Python servers
+    which run the new Python frontend code. This is highly experimental
+    at the moment and may not include the full API.
+
     By the default, the webserver can be accessed at: http://127.0.0.1:8088
     """
 
@@ -208,10 +213,31 @@ class AdminServe:
         group = parser.add_argument_group('Server arguments')
         group.add_argument('--server', default='127.0.0.1:8088',
                            help='The address the server will listen to.')
+        group.add_argument('--engine', default='php',
+                           choices=('php', 'sanic', 'falcon'),
+                           help='Webserver framework to run. (default: php)')
 
 
     def run(self, args: NominatimArgs) -> int:
-        run_php_server(args.server, args.project_dir / 'website')
+        if args.engine == 'php':
+            run_php_server(args.server, args.project_dir / 'website')
+        elif args.engine == 'sanic':
+            import nominatim.server.sanic.server
+
+            app = nominatim.server.sanic.server.get_application(args.project_dir)
+
+            server_info = args.server.split(':', 1)
+            host = server_info[0]
+            if len(server_info) > 1:
+                if not server_info[1].isdigit():
+                    raise UsageError('Invalid format for --server parameter. Use <host>:<port>')
+                port = int(server_info[1])
+            else:
+                port = 8088
+            app.run(host=host, port=port, debug=True)
+        elif args.engine == 'falcon':
+            raise NotImplementedError('Support for falcon not yet available.')
+
         return 0