Town / City geolocations with FastAPI & Mongo

Overview

Makefile CI

geolocations-api

United Kingdom Town / City geolocations with FastAPI & Mongo

Build container

To build a custom image or extend the api run the following cmds

# update the following variables as required
API_PORT=7000
API_HOST=locahost
# API variables
API_DB_NAME=towns_db
API_DB_USERNAME=admin
API_DB_PASSWORD=admin
API_DB_HOST=host.docker.internal
API_DB_PORT=27017

# Then build & run
make docker-build
make docker-run

Build locally instructions

Open Makefile in your ide & update the following varables as required:

DB_NAME=<YOUR_DB_NAME>
DB_USERNAME=<YOUR_DB_USERNAME>
DB_PASSWORD=<YOUR_DB_PASSWORD>

Make sure you have mongoimport command available & run the below command to import the towns JSON dump

make mongo-import-towns
You might also like...
Adds simple SQLAlchemy support to FastAPI

FastAPI-SQLAlchemy FastAPI-SQLAlchemy provides a simple integration between FastAPI and SQLAlchemy in your application. It gives access to useful help

Opinionated set of utilities on top of FastAPI

FastAPI Contrib Opinionated set of utilities on top of FastAPI Free software: MIT license Documentation: https://fastapi-contrib.readthedocs.io. Featu

Reusable utilities for FastAPI

Reusable utilities for FastAPI Documentation: https://fastapi-utils.davidmontague.xyz Source Code: https://github.com/dmontagu/fastapi-utils FastAPI i

This code generator creates FastAPI app from an openapi file.

fastapi-code-generator This code generator creates FastAPI app from an openapi file. This project is an experimental phase. fastapi-code-generator use

FastAPI framework plugins

Plugins for FastAPI framework, high performance, easy to learn, fast to code, ready for production fastapi-plugins FastAPI framework plugins Cache Mem

Prometheus exporter for Starlette and FastAPI

starlette_exporter Prometheus exporter for Starlette and FastAPI. The middleware collects basic metrics: Counter: starlette_requests_total Histogram:

🚀   Cookiecutter Template for FastAPI + React Projects.  Using PostgreSQL, SQLAlchemy, and Docker
🚀 Cookiecutter Template for FastAPI + React Projects. Using PostgreSQL, SQLAlchemy, and Docker

FastAPI + React · A cookiecutter template for bootstrapping a FastAPI and React project using a modern stack. Features FastAPI (Python 3.8) JWT authen

A rate limiter for Starlette and FastAPI

SlowApi A rate limiting library for Starlette and FastAPI adapted from flask-limiter. Note: this is alpha quality code still, the API may change, and

api versioning for fastapi web applications

fastapi-versioning api versioning for fastapi web applications Installation pip install fastapi-versioning Examples from fastapi import FastAPI from f

Comments
  • Error calling make mongo-import-towns

    Error calling make mongo-import-towns

    logs:

    joe@joe-OptiPlex-790:~/Projects/geolocations-api$ make mongo-import-towns
    mongoimport -d bn_database -c towns --file ./towns.json --authenticationDatabase admin --username admin --password admin --host localhost --port 27017
    2022-01-11T11:34:12.832+0000	Failed: error connecting to db server: server returned error on SASL authentication step: BSON field 'saslContinue.mechanism' is an unknown field.
    2022-01-11T11:34:12.832+0000	imported 0 documents
    make: *** [Makefile:30: mongo-import-towns] Error 1
    
    
    bug 
    opened by joegasewicz 1
  • Running on Linux

    Running on Linux

    Error running on Ubuntu 20.04.3 LTS

    geolocations_1  | ERROR:    Exception in ASGI application
    geolocations_1  | Traceback (most recent call last):
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/uvicorn/protocols/http/httptools_impl.py", line 376, in run_asgi
    geolocations_1  |     result = await app(self.scope, self.receive, self.send)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/uvicorn/middleware/proxy_headers.py", line 75, in __call__
    geolocations_1  |     return await self.app(scope, receive, send)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/fastapi/applications.py", line 208, in __call__
    geolocations_1  |     await super().__call__(scope, receive, send)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/starlette/applications.py", line 112, in __call__
    geolocations_1  |     await self.middleware_stack(scope, receive, send)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/starlette/middleware/errors.py", line 181, in __call__
    geolocations_1  |     raise exc
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/starlette/middleware/errors.py", line 159, in __call__
    geolocations_1  |     await self.app(scope, receive, _send)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/starlette/middleware/cors.py", line 84, in __call__
    geolocations_1  |     await self.app(scope, receive, send)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/starlette/exceptions.py", line 82, in __call__
    geolocations_1  |     raise exc
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/starlette/exceptions.py", line 71, in __call__
    geolocations_1  |     await self.app(scope, receive, sender)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/starlette/routing.py", line 656, in __call__
    geolocations_1  |     await route.handle(scope, receive, send)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/starlette/routing.py", line 259, in handle
    geolocations_1  |     await self.app(scope, receive, send)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/starlette/routing.py", line 61, in app
    geolocations_1  |     response = await func(request)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/fastapi/routing.py", line 226, in app
    geolocations_1  |     raw_response = await run_endpoint_function(
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/fastapi/routing.py", line 161, in run_endpoint_function
    geolocations_1  |     return await run_in_threadpool(dependant.call, **values)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/starlette/concurrency.py", line 39, in run_in_threadpool
    geolocations_1  |     return await anyio.to_thread.run_sync(func, *args)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/anyio/to_thread.py", line 28, in run_sync
    geolocations_1  |     return await get_asynclib().run_sync_in_worker_thread(func, *args, cancellable=cancellable,
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/anyio/_backends/_asyncio.py", line 818, in run_sync_in_worker_thread
    geolocations_1  |     return await future
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/anyio/_backends/_asyncio.py", line 754, in run
    geolocations_1  |     result = context.run(func, *args)
    geolocations_1  |   File "/geolocations-api/./api/main.py", line 65, in locations
    geolocations_1  |     serialized_towns = mongo_id.multiple(towns)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/mongo_id_marshaller/mongo_id.py", line 31, in multiple
    geolocations_1  |     for query_data in _doc_generator(query_list):
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/mongo_id_marshaller/mongo_id.py", line 5, in _doc_generator
    geolocations_1  |     for doc in mongo_docs:
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/pymongo/cursor.py", line 1159, in next
    geolocations_1  |     if len(self.__data) or self._refresh():
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/pymongo/cursor.py", line 1057, in _refresh
    geolocations_1  |     self.__session = self.__collection.database.client._ensure_session()
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/pymongo/mongo_client.py", line 1603, in _ensure_session
    geolocations_1  |     return self.__start_session(True, causal_consistency=False)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/pymongo/mongo_client.py", line 1553, in __start_session
    geolocations_1  |     server_session = self._get_server_session()
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/pymongo/mongo_client.py", line 1589, in _get_server_session
    geolocations_1  |     return self._topology.get_server_session()
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/pymongo/topology.py", line 530, in get_server_session
    geolocations_1  |     session_timeout = self._check_session_support()
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/pymongo/topology.py", line 514, in _check_session_support
    geolocations_1  |     self._select_servers_loop(
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/pymongo/topology.py", line 216, in _select_servers_loop
    geolocations_1  |     raise ServerSelectionTimeoutError(
    geolocations_1  | pymongo.errors.ServerSelectionTimeoutError: host.docker.internal:27017: [Errno -2] Name or service not known, Timeout: 30s, Topology Description: <TopologyDescription id: 61dd85923abcec01d811f834, topology_type: Unknown, servers: [<ServerDescription ('host.docker.internal', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('host.docker.internal:27017: [Errno -2] Name or service not known')>]>
    geolocations_1  | ERROR:    Exception in ASGI application
    geolocations_1  | Traceback (most recent call last):
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/uvicorn/protocols/http/httptools_impl.py", line 376, in run_asgi
    geolocations_1  |     result = await app(self.scope, self.receive, self.send)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/uvicorn/middleware/proxy_headers.py", line 75, in __call__
    geolocations_1  |     return await self.app(scope, receive, send)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/fastapi/applications.py", line 208, in __call__
    geolocations_1  |     await super().__call__(scope, receive, send)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/starlette/applications.py", line 112, in __call__
    geolocations_1  |     await self.middleware_stack(scope, receive, send)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/starlette/middleware/errors.py", line 181, in __call__
    geolocations_1  |     raise exc
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/starlette/middleware/errors.py", line 159, in __call__
    geolocations_1  |     await self.app(scope, receive, _send)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/starlette/middleware/cors.py", line 84, in __call__
    geolocations_1  |     await self.app(scope, receive, send)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/starlette/exceptions.py", line 82, in __call__
    geolocations_1  |     raise exc
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/starlette/exceptions.py", line 71, in __call__
    geolocations_1  |     await self.app(scope, receive, sender)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/starlette/routing.py", line 656, in __call__
    geolocations_1  |     await route.handle(scope, receive, send)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/starlette/routing.py", line 259, in handle
    geolocations_1  |     await self.app(scope, receive, send)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/starlette/routing.py", line 61, in app
    geolocations_1  |     response = await func(request)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/fastapi/routing.py", line 226, in app
    geolocations_1  |     raw_response = await run_endpoint_function(
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/fastapi/routing.py", line 161, in run_endpoint_function
    geolocations_1  |     return await run_in_threadpool(dependant.call, **values)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/starlette/concurrency.py", line 39, in run_in_threadpool
    geolocations_1  |     return await anyio.to_thread.run_sync(func, *args)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/anyio/to_thread.py", line 28, in run_sync
    geolocations_1  |     return await get_asynclib().run_sync_in_worker_thread(func, *args, cancellable=cancellable,
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/anyio/_backends/_asyncio.py", line 818, in run_sync_in_worker_thread
    geolocations_1  |     return await future
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/anyio/_backends/_asyncio.py", line 754, in run
    geolocations_1  |     result = context.run(func, *args)
    geolocations_1  |   File "/geolocations-api/./api/main.py", line 65, in locations
    geolocations_1  |     serialized_towns = mongo_id.multiple(towns)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/mongo_id_marshaller/mongo_id.py", line 31, in multiple
    geolocations_1  |     for query_data in _doc_generator(query_list):
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/mongo_id_marshaller/mongo_id.py", line 5, in _doc_generator
    geolocations_1  |     for doc in mongo_docs:
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/pymongo/cursor.py", line 1159, in next
    geolocations_1  |     if len(self.__data) or self._refresh():
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/pymongo/cursor.py", line 1057, in _refresh
    geolocations_1  |     self.__session = self.__collection.database.client._ensure_session()
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/pymongo/mongo_client.py", line 1603, in _ensure_session
    geolocations_1  |     return self.__start_session(True, causal_consistency=False)
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/pymongo/mongo_client.py", line 1553, in __start_session
    geolocations_1  |     server_session = self._get_server_session()
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/pymongo/mongo_client.py", line 1589, in _get_server_session
    geolocations_1  |     return self._topology.get_server_session()
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/pymongo/topology.py", line 530, in get_server_session
    geolocations_1  |     session_timeout = self._check_session_support()
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/pymongo/topology.py", line 514, in _check_session_support
    geolocations_1  |     self._select_servers_loop(
    geolocations_1  |   File "/root/.local/share/virtualenvs/geolocations-api-NPGMF1o2/lib/python3.10/site-packages/pymongo/topology.py", line 216, in _select_servers_loop
    geolocations_1  |     raise ServerSelectionTimeoutError(
    geolocations_1  | pymongo.errors.ServerSelectionTimeoutError: host.docker.internal:27017: [Errno -2] Name or service not known, Timeout: 30s, Topology Description: <TopologyDescription id: 61dd85923abcec01d811f834, topology_type: Unknown, servers: [<ServerDescription ('host.docker.internal', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('host.docker.internal:27017: [Errno -2] Name or service not known')>]>
    
    
    bug 
    opened by joegasewicz 0
Releases(v1.0.0)
Owner
Joe Gasewicz
I'm a Go, Python, Typescript, Swift & C full stack developer.. I'm a Jazz bassist & prefer cats.
Joe Gasewicz
Simple FastAPI Example : Blog API using FastAPI : Beginner Friendly

fastapi_blog FastAPI : Simple Blog API with CRUD operation Steps to run the project: git clone https://github.com/mrAvi07/fastapi_blog.git cd fastapi-

Avinash Alanjkar 1 Oct 8, 2022
Пример использования GraphQL Ariadne с FastAPI и сравнение его с GraphQL Graphene FastAPI

FastAPI Ariadne Example Пример использования GraphQL Ariadne с FastAPI и сравнение его с GraphQL Graphene FastAPI - GitHub ###Запуск на локальном окру

ZeBrains Team 9 Nov 10, 2022
Sample-fastapi - A sample app using Fastapi that you can deploy on App Platform

Getting Started We provide a sample app using Fastapi that you can deploy on App

Erhan BÜTE 2 Jan 17, 2022
Flask-vs-FastAPI - Understanding Flask vs FastAPI Web Framework. A comparison of two different RestAPI frameworks.

Flask-vs-FastAPI Understanding Flask vs FastAPI Web Framework. A comparison of two different RestAPI frameworks. IntroductionIn Flask is a popular mic

Mithlesh Navlakhe 1 Jan 1, 2022
FastAPI Server Session is a dependency-based extension for FastAPI that adds support for server-sided session management

FastAPI Server-sided Session FastAPI Server Session is a dependency-based extension for FastAPI that adds support for server-sided session management.

DevGuyAhnaf 5 Dec 23, 2022
fastapi-admin2 is an upgraded fastapi-admin, that supports ORM dialects, true Dependency Injection and extendability

FastAPI2 Admin Introduction fastapi-admin2 is an upgraded fastapi-admin, that supports ORM dialects, true Dependency Injection and extendability. Now

Glib 14 Dec 5, 2022
Code Specialist 27 Oct 16, 2022
Fastapi-ml-template - Fastapi ml template with python

FastAPI ML Template Run Web API Local $ sh run.sh # poetry run uvicorn app.mai

Yuki Okuda 29 Nov 20, 2022
FastAPI-Amis-Admin is a high-performance, efficient and easily extensible FastAPI admin framework. Inspired by django-admin, and has as many powerful functions as django-admin.

简体中文 | English 项目介绍 FastAPI-Amis-Admin fastapi-amis-admin是一个拥有高性能,高效率,易拓展的fastapi管理后台框架. 启发自Django-Admin,并且拥有不逊色于Django-Admin的强大功能. 源码 · 在线演示 · 文档 · 文

AmisAdmin 318 Dec 31, 2022
A dynamic FastAPI router that automatically creates CRUD routes for your models

⚡ Create CRUD routes with lighting speed ⚡ A dynamic FastAPI router that automatically creates CRUD routes for your models

Adam Watkins 950 Jan 8, 2023