Supa-Fast API (Supabase FastAPI) : Deploying on DETA
source link: https://dev.to/aunicorndev/supa-fast-api-supabase-fastapi-deploying-on-deta-4cjd
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
In this last part of the tutorial of the series,we will be looking at deploying the FastAPI that we build in the last tutorial.
We have our Supa-Fast API working on our local system.. But will we be able to deploy it easily????
To my surprise, DETA has made it relatively easy to deploy the API..
I hit some roadblocks while deploying (OBVIOUSLYYYY) and shared a trick that might work for you like it did for me.
About Deta
As stated on their official website docs,
Deta is a free cloud crafted with the developer and user experience at heart.
What about Pricing??
It's FREE.FOREVER.
Yes, their motto states
We want anyone, at any age from anywhere in the world to experiment and build their ideas without worrying about limits of credit cards.
Prepare your Local Environment
If you have been following the previous tutorials, we have been using virtualenv and have only a limited dependencies in our virtualenv
To get the list of installed dependencies for the project , go to the api
directory and run the command
pip freeze > requirements.txt
Enter fullscreen mode
Exit fullscreen mode
This will create a requirements.txt
file in the api
directory.
#requirements.txt
anyio==3.4.0
asgiref==3.4.1
atomicwrites==1.4.0
attrs==21.2.0
certifi==2021.10.8
chardet==4.0.0
charset-normalizer==2.0.8
click==8.0.3
colorama==0.4.4
dataclasses==0.6
deprecation==2.1.0
fastapi==0.70.0
gotrue==0.2.0
h11==0.12.0
httpcore==0.13.7
httptools==0.2.0
httpx==0.19.0
idna==2.10
importlib-metadata==4.8.2
iniconfig==1.1.1
packaging==21.3
pluggy==1.0.0
postgrest-py==0.5.0
py==1.11.0
pydantic==1.8.2
pyparsing==3.0.6
pytest==6.2.5
python-dateutil==2.8.2
python-dotenv==0.19.2
PyYAML==6.0
realtime-py==0.1.3
requests==2.25.1
rfc3986==1.5.0
six==1.16.0
sniffio==1.2.0
starlette==0.16.0
supabase==0.0.3
toml==0.10.2
typing_extensions==4.0.0
urllib3==1.26.7
uvicorn==0.15.0
watchgod==0.7
websockets==9.1
zipp==3.6.0
Enter fullscreen mode
Exit fullscreen mode
Make sure you have the
.env
file with the environment variables as the API won't get deployed in case you missed that step in the last tutorial.
Working with DETA
To start, install the DETA CLI in powershell and login into deta using the following commands..
//The below command for install is for Windows
iwr https://get.deta.dev/cli.ps1 -useb | iex
deta login
Enter fullscreen mode
Exit fullscreen mode
To get the list of available commands, run
deta --help
We'll create a new deta micro for the supafast-api
after navigating to the api
folder from the last tutorial
deta new
Enter fullscreen mode
Exit fullscreen mode
// Response on running deta new command
Successfully created a new micro
{
"name": "api",
"id": "XXXX_XXXXX_XXXXX_XXXX_XXXX_XXXX",
"project": "XXXXXXX",
"runtime": "python3.9",
"endpoint": "XXXXXXXXXX",
"region": "XXXXXXXX",
"visor": "enabled",
"http_auth": "disabled"
}
Enter fullscreen mode
Exit fullscreen mode
The above command will install the dependencies listed in the requirements.txt
on our new micro and will be visible on the Deta web interface.
In the previous tutorial, we added a .env
file for the local environment, but for this created Deta instance, we don't have any environment variable defined. To solve that, run the following command while in the api
directory.
deta update -e .env
Enter fullscreen mode
Exit fullscreen mode
And our API is available at https://e5w1sl.deta.dev/docs to check out 🤝🤝.
Your API url can be found on the DETA Dashboard as above.
If you want to open up the endpoint to public, run the command
deta auth disable
//Response from CLI
Successfully disabled http auth
Enter fullscreen mode
Exit fullscreen mode
Not Getting Any OUTPUT ?????
If you face an error (like me) on running your API in the browser with a response :
Bad Gateway
The micro ran into an error while processing the request.
If you are the owner of the micro, please check your logs.
If the response took around 10s, it might be due to the time out limit.
Enter fullscreen mode
Exit fullscreen mode
Run deta logs
and try if you can find any error in the logs..
For example, this is the error I got in my logs
[ERROR] AttributeError: module 'typing' has no attribute '_ClassVar'
Traceback (most recent call last):
File "/var/lang/lib/python3.9/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 850, in exec_module
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
File "/var/task/_entry.py", line 1, in <module>
from detalib.handler import handle
File "/opt/python/detalib/handler.py", line 3, in <module>
from . import handlers
File "/opt/python/detalib/handlers.py", line 3, in <module>
from .adapters.asgi import Asgi
File "/opt/python/detalib/adapters/asgi/__init__.py", line 1, in <module>
from .adapter import Asgi # noqa
File "/opt/python/detalib/adapters/asgi/adapter.py", line 7, in <module>
from .lifespan import Lifespan
File "/opt/python/detalib/adapters/asgi/lifespan.py", line 9, in <module>
class Lifespan:
File "/opt/python/dataclasses.py", line 958, in dataclass
return wrap(_cls)
File "/opt/python/dataclasses.py", line 950, in wrap
return _process_class(cls, init, repr, eq, order, unsafe_hash, frozen)
File "/opt/python/dataclasses.py", line 800, in _process_class
cls_fields = [_get_field(cls, name, type)
File "/opt/python/dataclasses.py", line 800, in <listcomp>
cls_fields = [_get_field(cls, name, type)
File "/opt/python/dataclasses.py", line 659, in _get_field
if (_is_classvar(a_type, typing)
File "/opt/python/dataclasses.py", line 550, in _is_classvar
return type(a_type) is typing._ClassVar
[2021-11-11T00:32:56+05:30] Unknown application error occurred
Enter fullscreen mode
Exit fullscreen mode
For this particular error, the problem is with the dataclasses
package in the requirements and we will remove it to get the correct output.
For that, run the following commands
pip uninstall dataclasses
pip freeze >requirements.txt
//run this in powershell
deta deploy
Enter fullscreen mode
Exit fullscreen mode
Now on running the Deta Micro with the URL (https://e5w1sl.deta.dev/themes)
// 20211130191258
// https://e5w1sl.deta.dev/themes
{
"data": [
{
"id": 1,
"created_at": "2021-11-26T15:28:21+00:00",
"monsterTheme": "demo-theme-1",
"monsterThemeBg": "https://jtpcokcjjqbizziufohl.supabase.co/storage/v1/object/public/supafast-api/themes/demo-theme-1.png"
},
{
"id": 2,
"created_at": "2021-11-26T15:29:45+00:00",
"monsterTheme": "demo-theme-2",
"monsterThemeBg": "https://jtpcokcjjqbizziufohl.supabase.co/storage/v1/object/public/supafast-api/themes/demo-theme-2.png"
},
{
"id": 3,
"created_at": "2021-11-26T15:30:04+00:00",
"monsterTheme": "demo-theme-3",
"monsterThemeBg": "https://jtpcokcjjqbizziufohl.supabase.co/storage/v1/object/public/supafast-api/themes/demo-theme-3.png"
},
{
"id": 4,
"created_at": "2021-11-26T15:30:12+00:00",
"monsterTheme": "demo-theme-4",
"monsterThemeBg": "https://jtpcokcjjqbizziufohl.supabase.co/storage/v1/object/public/supafast-api/themes/demo-theme-4.png"
},
{
"id": 6,
"created_at": "2021-11-26T15:30:21+00:00",
"monsterTheme": "demo-theme-5",
"monsterThemeBg": "https://jtpcokcjjqbizziufohl.supabase.co/storage/v1/object/public/supafast-api/themes/demo-theme-5.png"
}
],
"status_code": 200
}
Enter fullscreen mode
Exit fullscreen mode
For more interactive output of the API Documentation, use the URL (https://e5w1sl.deta.dev/docs) which is provided by Swagger UI.
And as Francesco says, NOT DEPLOY on FRIDAY!!!
Conclusion
With the API deployed, this series comes to an end🎉🎉✨✨.
In case you have any doubts or suggestions regarding the article(s), feel free to contact me on my email [email protected] or on Twitter at @aUnicornDev.
The API built in this series is used in the tabsMonster project. Everyone is more than welcome to checkout and contribute in this Open Source Project.
aUnicornDev / tabsMonster
A Chrome extension to keep a tab on your Browser Tabs
Important Links
Below are the links for docs and products if you are more interesed.
Thank you for Reading!!
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK