Debug School

rakesh kumar
rakesh kumar

Posted on

How to Create parameter based crud api in python with django in server side then use this in laravel

Sure, here's an example of how to create a parameter-based CRUD API in Python using Django and use it in Laravel with full code:

Create a Django app with parameter-based CRUD API endpoints

  1. Create a new Django project and app by running the commands django-admin startproject myproject and python manage.py startapp myapp
  2. Define the models for the app in the myapp/models.py file
  3. Define the views for the app in the myapp/views.py file, using Django REST framework to create the API endpoints
# myapp/models.py

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.CharField(max_length=255)
    published_date = models.DateField()

# myapp/views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from myapp.models import Book
from myapp.serializers import BookSerializer

class BookAPIView(APIView):
    def get(self, request, id=None):
        if id is None:
            queryset = Book.objects.all()
            serializer = BookSerializer(queryset, many=True)
        else:
            book = Book.objects.get(id=id)
            serializer = BookSerializer(book)
        return Response(serializer.data)

    def post(self, request):
        serializer = BookSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

    def put(self, request, id):
        book = Book.objects.get(id=id)
        serializer = BookSerializer(book, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def delete(self, request, id):
        book = Book.objects.get(id=id)
        book.delete()
        return Response(status=204)
Enter fullscreen mode Exit fullscreen mode

Image description

Image description

Image description

2.Define serializers for the Django models
Define a serializer for each model used in the CRUD API endpoints in the myapp/serializers.py file

# myapp/serializers.py

from rest_framework import serializers
from myapp.models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'
Enter fullscreen mode Exit fullscreen mode

Image description

3.Create a Django URL pattern for the app's API endpoint
Define a URL pattern in the myproject/urls.py file that maps to the BookAPIView view

# myproject/urls.py

from django.urls import path
from myapp.views import BookAPIView

urlpatterns = [
    path('api/book/', BookAPIView.as_view(), name='book_api'),
    path('api/book/<int:id>/', BookAPIView.as_view(), name='book_api_detail'),
]
Enter fullscreen mode Exit fullscreen mode

Image description

4.Create a Laravel app and use the Django API

  1. Create a new Laravel app by running the command composer create-project --prefer-dist laravel/laravel mylaravelapp
  2. Install the guzzlehttp/guzzle package by running the command composer require guzzlehttp/guzzle
  3. Define a Laravel controller that calls the Django API using GuzzleHTTP
  4. Define Laravel routes that map to the controller methods
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use GuzzleHttp\Client;

class BookController extends Controller
{
    protected $client;

    public function __construct()
    {
        $this->client = new Client(['base_uri' => 'http://localhost:8000/']);
    }

    public function index()
    {
        $response = $this->client->get('api/books/');
        $books = json_decode($response->getBody()->getContents());
        return view('books.index', compact('books'));
    }

    public function show($id)
    {
        $response = $this->client->get('api/books/' . $id);
        $book = json_decode($response->getBody()->getContents());
        return view('books.show', compact('book'));
    }

    public function store(Request $request)
    {
        $response = $this->client->post('api/books/', [
            'form_params' => [
                'title' => $request->title,
                'author' => $request->author,
                'publisher' => $request->publisher
            ]
        ]);
        $book = json_decode($response->getBody()->getContents());
        return redirect('/books/' . $book->id);
    }

    public function update(Request $request, $id)
    {
        $response = $this->client->put('api/books/' . $id, [
            'form_params' => [
                'title' => $request->title,
                'author' => $request->author,
                'publisher' => $request->publisher
            ]
        ]);
        $book = json_decode($response->getBody()->getContents());
        return redirect('/books/' . $book->id);
    }

    public function destroy($id)
    {
        $response = $this->client->delete('api/books/' . $id);
        return redirect('/books');
    }
}
Enter fullscreen mode Exit fullscreen mode

Image description

Image description

Image description

Image description

OR JSON FORM

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use GuzzleHttp\Client;

class BookController extends Controller
{
    protected $client;

    public function __construct()
    {
        $this->client = new Client(['base_uri' => 'http://localhost:8000/']);
    }

    public function index()
    {
        $response = $this->client->get('api/books/');
        $books = json_decode($response->getBody()->getContents());
        return response()->json($books);
    }

    public function show($id)
    {
        $response = $this->client->get('api/books/' . $id);
        $book = json_decode($response->getBody()->getContents());
        return response()->json($book);
    }

    public function store(Request $request)
    {
        $response = $this->client->post('api/books/', [
            'form_params' => [
                'title' => $request->title,
                'author' => $request->author,
                'publisher' => $request->publisher
            ]
        ]);
        $book = json_decode($response->getBody()->getContents());
        return response()->json($book);
    }

    public function update(Request $request, $id)
    {
        $response = $this->client->put('api/books/' . $id, [
            'form_params' => [
                'title' => $request->title,
                'author' => $request->author,
                'publisher' => $request->publisher
            ]
        ]);
        $book = json_decode($response->getBody()->getContents());
        return response()->json($book);
    }

    public function destroy($id)
    {
        $response = $this->client->delete('api/books/' . $id);
        return response()->json(['message' => 'Book deleted successfully.']);
    }
}
Enter fullscreen mode Exit fullscreen mode

Image description

Image description

Image description

Image description

5.Create views for displaying and modifying records
Create views that display lists of records, as well as forms for adding, editing, and deleting records

<!-- resources/views/books/index.blade.php -->

<h1>Books</h1>

<a href="/books/create">Add a book</a>

<table>
    <thead>
        <tr>
            <th>Title</th>
            <th>Author</th>
            <th>Publisher</th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach ($books as $book
Enter fullscreen mode Exit fullscreen mode

===============================================================
Sure, here's a step-by-step guide on how to use a parameter-based CRUD API in Laravel with JSON response:

Create a Laravel app

  1. Create a new Laravel app by running the command composer create-project --prefer-dist laravel/laravel mylaravelapp
  2. Install GuzzleHTTP package
  3. Install the guzzlehttp/guzzle package by running the command composer require guzzlehttp/guzzle
  4. Define routes for API endpoints
  5. Define Laravel routes that map to the API endpoint URLs provided by the Python/Django API
Route::get('/books', 'BookController@index');
Route::get('/books/{id}', 'BookController@show');
Route::post('/books', 'BookController@store');
Route::put('/books/{id}', 'BookController@update');
Route::delete('/books/{id}', 'BookController@destroy');
Enter fullscreen mode Exit fullscreen mode

Create a Laravel controller that calls the Python/Django API using GuzzleHTTP
Define a controller that contains methods for each CRUD operation
In each method, use GuzzleHTTP to send requests to the Python/Django API endpoint
Use the returned data to display or modify records

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use GuzzleHttp\Client;

class BookController extends Controller
{
    protected $client;

    public function __construct()
    {
        $this->client = new Client(['base_uri' => 'http://localhost:8000/']);
    }

    public function index()
    {
        $response = $this->client->get('api/books/');
        $books = json_decode($response->getBody()->getContents());
        return response()->json($books);
    }

    public function show($id)
    {
        $response = $this->client->get('api/books/' . $id);
        $book = json_decode($response->getBody()->getContents());
        return response()->json($book);
    }

    public function store(Request $request)
    {
        $response = $this->client->post('api/books/', [
            'form_params' => [
                'title' => $request->title,
                'author' => $request->author,
                'publisher' => $request->publisher
            ]
        ]);
        $book = json_decode($response->getBody()->getContents());
        return response()->json($book);
    }

    public function update(Request $request, $id)
    {
        $response = $this->client->put('api/books/' . $id, [
            'form_params' => [
                'title' => $request->title,
                'author' => $request->author,
                'publisher' => $request->publisher
            ]
        ]);
        $book = json_decode($response->getBody()->getContents());
        return response()->json($book);
    }

    public function destroy($id)
    {
        $response = $this->client->delete('api/books/' . $id);
        return response()->json(['message' => 'Book deleted successfully.']);
    }
}
Enter fullscreen mode Exit fullscreen mode

Define middleware for JSON response
Define a middleware that will set the Accept header to application/json for all requests
Add the middleware to the api middleware group in

app/Http/Kernel.php

namespace App\Http\Middleware;

use Closure;

class AcceptJson
{
    public function handle($request, Closure $next)
    {
        $request->headers->set('Accept', 'application/json');
        return $next($request);
    }
}
Enter fullscreen mode Exit fullscreen mode
// in app/Http/Kernel.php

protected $middlewareGroups = [
Enter fullscreen mode Exit fullscreen mode

==========================
Sure, here's a step-by-step guide on how to use parameter-based CRUD API made by Python with Django in server-side, then use it in Laravel:

Create a parameter-based CRUD API in Python with Django

  1. Create a new Django project and app by running the commands django-admin startproject myproject and python manage.py startapp myapp
  2. Define the models for the app in the myapp/models.py file
  3. Define the views for the app in the myapp/views.py file, using Django REST framework to create the API endpoints
  4. Define serializers for the Django models
  5. Create a Django URL pattern for the app's API endpoint Here's an example code for the myapp/views.py file:
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from myapp.models import Book
from myapp.serializers import BookSerializer

@api_view(['GET', 'POST'])
def book_list(request):
    if request.method == 'GET':
        books = Book.objects.all()
        serializer = BookSerializer(books, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = BookSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

@api_view(['GET', 'PUT', 'DELETE'])
def book_detail(request, pk):
    try:
        book = Book.objects.get(pk=pk)
    except Book.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        serializer = BookSerializer(book)
        return Response(serializer.data)

    elif request.method == 'PUT':
        serializer = BookSerializer(book, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE':
        book.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
Enter fullscreen mode Exit fullscreen mode

Image description

Image description

Image description

And here's an example code for the myproject/urls.py file:

from django.urls import path
from myapp import views

urlpatterns = [
    path('api/books/', views.book_list),
    path('api/books/<int:pk>/', views.book_detail),
]
Enter fullscreen mode Exit fullscreen mode

Image description

Start the Django server

Run the command python manage.py runserver to start the Django development server
Create a Laravel app

Create a new Laravel app by running the command composer create-project --prefer-dist laravel/laravel mylaravelapp
Install the guzzlehttp/guzzle package by running the command composer require guzzlehttp/guzzle
Use the Django API in Laravel

Create a new Laravel controller that calls the Django API using GuzzleHTTP
Define Laravel routes that map to the controller methods
Here's an example code for the

app/Http/Controllers/BookController.php file:

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use GuzzleHttp\Client;

class BookController extends Controller
{
    protected $client;

    public function __construct()
    {
        $this->client = new Client(['base_uri' => 'http://localhost:8000/']);
    }

    public function index()
    {
        $response = $this->client->get('api/books/');
        $books = json_decode($response->getBody()->getContents());
        return view('books.index', compact('books'));
    }

    public function show($id)
    {
        $response = $this->client->get('api/books/' . $id);
        $book = json_decode($response->getBody()->getContents());
        return view('books.show', compact('book'));
    }

    public function store(Request $request)
    {
        $response = $this->client->post('api/books/', [
            'form_params' => [
                'title' => $request->title,
                'author' => $request->author,
                'publisher' => $request->publisher
            ]
        ]);
        $book = json_decode($response->getBody()->getContents());
        return redirect('/books/' . $book->id);
    }

    public function update(Request $request, $id)
    {
        $response = $this->client->put('api/books/' . $id, [
            'form_params' => [
                'title' => $request->title,
                'author' => $request->author,
                'publisher' => $request->publisher
            ]
        ]);
        $book = json_decode($response->getBody()->getContents());
        return redirect('/books/' . $book->id);
    }

    public function destroy($id)
    {
        $response = $this->client->delete('api/books/' . $id);
        return redirect('/books');
    }
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)