mirror of
https://github.com/autistic-symposium/web3-starter-py.git
synced 2025-05-17 14:10:21 -04:00
Add Location API project on FastAPI deplpyed in Vercel
This commit is contained in:
parent
188195b7a3
commit
896978f1ab
12 changed files with 134 additions and 0 deletions
|
@ -1,6 +1,11 @@
|
||||||
# ✨🐍 [Scratch Space] Python: small projects and boilerplates
|
# ✨🐍 [Scratch Space] Python: small projects and boilerplates
|
||||||
|
|
||||||
|
|
||||||
|
### APIs
|
||||||
|
|
||||||
|
* [FastAPI Location API deployed in Vercel](github.com/bt3gl-labs/Scratch-Space-Python/tree/master/fastapi-location-api)
|
||||||
|
|
||||||
|
|
||||||
### Boilerplates
|
### Boilerplates
|
||||||
|
|
||||||
* [CLI with Click](https://github.com/bt3gl-labs/Scratch-Space-Python/tree/master/boilerplates-click)
|
* [CLI with Click](https://github.com/bt3gl-labs/Scratch-Space-Python/tree/master/boilerplates-click)
|
||||||
|
|
4
fastapi-location-app/.gitignore
vendored
Normal file
4
fastapi-location-app/.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
__pycache__
|
||||||
|
.vercel
|
||||||
|
venv
|
||||||
|
.env
|
5
fastapi-location-app/.vercelignore
Normal file
5
fastapi-location-app/.vercelignore
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
requirements-dev.txt
|
||||||
|
venv
|
||||||
|
main.py
|
||||||
|
README.md
|
||||||
|
.gitignore
|
34
fastapi-location-app/README.md
Normal file
34
fastapi-location-app/README.md
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
# Location API 🗺
|
||||||
|
|
||||||
|
|
||||||
|
Location API deployed in Vercel and built with FastAPI.
|
||||||
|
|
||||||
|
## Endpoint /location
|
||||||
|
|
||||||
|
Input data:
|
||||||
|
|
||||||
|
```
|
||||||
|
{"city": "berlin"}
|
||||||
|
```
|
||||||
|
|
||||||
|
Response:
|
||||||
|
|
||||||
|
```
|
||||||
|
{"lat":52.5186925,"lon":13.3996024,"tzone":1}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Installing
|
||||||
|
|
||||||
|
```
|
||||||
|
virtualenv -p python3.9 venv
|
||||||
|
source venv/bin/activate
|
||||||
|
pipenv install
|
||||||
|
```
|
||||||
|
|
||||||
|
### Running
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
python3 main.py
|
||||||
|
```
|
0
fastapi-location-app/api/__init__.py
Normal file
0
fastapi-location-app/api/__init__.py
Normal file
14
fastapi-location-app/api/api.py
Normal file
14
fastapi-location-app/api/api.py
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
|
||||||
|
from .routes import router as LocationRouter
|
||||||
|
from fastapi import FastAPI
|
||||||
|
|
||||||
|
app = FastAPI()
|
||||||
|
|
||||||
|
|
||||||
|
@app.get("/", tags=["Root"])
|
||||||
|
async def read_root() -> dict:
|
||||||
|
return {
|
||||||
|
"message": "$CHOICES Timezone API ⏳✨. Try /docs to learn about this API"
|
||||||
|
}
|
||||||
|
|
||||||
|
app.include_router(LocationRouter, prefix="/tzone")
|
35
fastapi-location-app/api/methods.py
Normal file
35
fastapi-location-app/api/methods.py
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
import pytz
|
||||||
|
import datetime
|
||||||
|
from geopy.geocoders import Nominatim
|
||||||
|
from timezonefinder import TimezoneFinder
|
||||||
|
|
||||||
|
|
||||||
|
def _find_timezone(lat, lon) -> int:
|
||||||
|
obj = TimezoneFinder()
|
||||||
|
tzone = obj.timezone_at(lng=lon, lat=lat)
|
||||||
|
timezone = datetime.datetime.now(pytz.timezone(tzone)).strftime('%z')
|
||||||
|
try:
|
||||||
|
timezone = int(timezone[:-2])
|
||||||
|
except:
|
||||||
|
print('Error formatting timezone {}'.format(timezone))
|
||||||
|
return timezone
|
||||||
|
|
||||||
|
|
||||||
|
def get_location(data) -> dict:
|
||||||
|
try:
|
||||||
|
city = data['city']
|
||||||
|
except:
|
||||||
|
print('Data is ill-formatted: {}'.format(data))
|
||||||
|
|
||||||
|
geolocator = Nominatim(user_agent="$choices")
|
||||||
|
location = geolocator.geocode(city)
|
||||||
|
|
||||||
|
data = {
|
||||||
|
'lat': location.latitude,
|
||||||
|
'lon': location.longitude,
|
||||||
|
'tzone': _find_timezone(location.latitude, location.longitude)
|
||||||
|
}
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
17
fastapi-location-app/api/routes.py
Normal file
17
fastapi-location-app/api/routes.py
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
from pydantic import BaseModel
|
||||||
|
from fastapi import APIRouter
|
||||||
|
from .methods import get_location
|
||||||
|
|
||||||
|
|
||||||
|
router = APIRouter()
|
||||||
|
|
||||||
|
class City(BaseModel):
|
||||||
|
city: str
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/")
|
||||||
|
def search_city(data: City) -> dict:
|
||||||
|
return get_location(data.dict())
|
||||||
|
|
||||||
|
|
||||||
|
|
4
fastapi-location-app/main.py
Normal file
4
fastapi-location-app/main.py
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
import uvicorn
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
uvicorn.run("api.api:app", host="0.0.0.0", port=8000, reload=True)
|
1
fastapi-location-app/requirements-dev.txt
Normal file
1
fastapi-location-app/requirements-dev.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
uvicorn
|
4
fastapi-location-app/requirements.txt
Normal file
4
fastapi-location-app/requirements.txt
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
timezonefinder==5.2.0
|
||||||
|
pytz==2022.1
|
||||||
|
pydantic
|
||||||
|
fastapi
|
11
fastapi-location-app/vercel.json
Normal file
11
fastapi-location-app/vercel.json
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"routes": [
|
||||||
|
{"src": "/(.*)", "dest": "api/api.py"}
|
||||||
|
],
|
||||||
|
"functions": {
|
||||||
|
"api/api.py": {
|
||||||
|
"memory": 3008,
|
||||||
|
"maxDuration": 30
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue