Django Ninja Framework for Api Development
(Note image is from the coolest Ninja Movie ever, Ninja Shadow of a Tear 2013 need to watch before you die)
When creating Apis a lot of people turn to Django Rest Framework is not a bad framework for apis, but recently in a personal I wanted to try out a new Frame work called Django Ninja and I enjoyed using it also made my life easy here are the details and also I believe is faster
https://django-ninja.rest-framework.com
Installation:
pip install django-ninja
also django must also already be installed
/home/macunan/http/raspberrypi_fmradio/fmtrans
In the application of your project in my case called fmtrans and project is called raspberrypi_fmradio
Add the following
1) path("api/",api.urls)
to file in urls.py of your Django application.
In my particular case:
urlpatterns= [
path('',views.index),
path('light',views.light),
path('cloud',views.cloud),
path('add',views.add),
path('del',views.borrar),
path('modify',views.modify),
path('ajax/', ajax_view, name="ajax"),
path('config', views.config),
path('download', views.download_file),
path('export', views.export),
path("api/",api.urls),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
and to the top of urls.py
from django.contrib import admin from django.urls import path from .api import api
Afterwards create api.py in same directory here is where our api logic will reside.
api.py Content
---------------------------
from datetime import date
from typing import List
from ninja import NinjaAPI, Schema
from django.shortcuts import get_object_or_404
#In my case I imported the models so I could use #them
from .models import Radios,Config
from typing import List
#In my case also imported some functions
from .pyfunctions import Server_Ops
api = NinjaAPI()
#Here you declare your api objects you will use just like in #models in normal django
#Radios out object I will return
class Radios_out(Schema):
id: int
name: str
url: str
state:str
#Radios in object I will require
class Radios_in(Schema):
name: str
url: str
#Here come first api to show list of radios in my case
@api.get("/radio_list", response=List[Radios_out])
def list_radios(request):
qs = Radios.objects.all()
return qs
To call used the following
<host>/api/radio_list
@api.post("/create_radio")
def create_radio(request, payload: Radios_in):
radio = Radios.objects.create(**payload.dict())
return {"id": radio.id}
Also with
http://192.168.31.232/api/docs
You can get the documentation of the api automatically which I think is very cool:
Here is complete api for your reference:
import os
from datetime import date
from typing import List
from ninja import NinjaAPI, Schema
from django.shortcuts import get_object_or_404
from .models import Radios,Config
from typing import List
from .pyfunctions import Server_Ops
api = NinjaAPI()
class Config_in(Schema):
frecuency: str
id: int
homelocation: str
class Radios_out(Schema):
id: int
name: str
url: str
state:str
class Radios_in(Schema):
name: str
url: str
class Toggle_in(Schema):
id: int
@api.post("/create_radio")
def create_radio(request, payload: Radios_in):
radio = Radios.objects.create(**payload.dict())
return {"id": radio.id}
@api.get("/radio_list", response=List[Radios_out])
def list_radios(request):
qs = Radios.objects.all()
return qs
@api.put("/update_radio/{id}")
def update_radio(request, id: int, payload: Radios_in):
radio = get_object_or_404(Radios, id=id)
for attr, value in payload.dict().items():
setattr(radio, attr, value)
radio.save()
return {"success": True}
@api.put("/toggle_radio/{id}")
def toggle_radio(request, id: int, payload: Toggle_in):
radio = get_object_or_404(Radios, id=id)
if radio.state == 'ON':
radio.state='OFF'
ops=Server_Ops()
ops.stop()
radio.save()
return {"transmit_status": False}
else:
ops=Server_Ops()
ops.writefile(id)
Radios.objects.filter(state='ON').update(state='OFF')
ops.restart()
radio.state='ON'
radio.save()
return {"transmit_status": True}
@api.delete("/delete_radio/{id}")
def delete_radio(request, id: int):
radio= get_object_or_404(Radios, id=id)
radio.delete()
return {"success": True}
@api.get("/radio_get/{id}", response=Radios_out)
def get_radio(request, id: int):
radio = get_object_or_404(Radios, id=id)
return radio
@api.get("/get_config", response=List[Config_in])
def get_config(request):
qs = Config.objects.latest('id')
return qs
@api.get("/export")
def export_radio(request):
ops=Server_Ops()
config = Config.objects.latest('id')
ops.export_stations()
return {"success": config.homelocation,'change':True}
You can also download the source code here:
https://github.com/macunan/iradio/blob/main/fmtrans/api.py
Happy coding !
Since you got this far here is a bonus for your efforts ninja attack on the compound:













