محمد صدرا برومند
محمد صدرا برومند
خواندن ۴ دقیقه·۱۰ ماه پیش

ساخت Snapp food Clone 🍔 _ بخش دوم

ساختار تکنولوژی های استفاده شده
ساختار تکنولوژی های استفاده شده


با سلام، من صدرا هستم!

در ادامه پست قبل که به ساخت مدل ها و migration آنها پرداختیم و در این پست به ساخت Serializer و سپس به مدیریت Request و Response و بروزرسانی admin.py و views.py و urls.py می پردازیم.

ساختار routing سمت بک اند با Django Rest Framework
ساختار routing سمت بک اند با Django Rest Framework


ایتدا یک فایل با نام serializers.py می سازیم و در آن کد های زیر را برای مدل های خود قرار می دهیم.

from rest_framework import serializers
from . import models
class CitySerializer(serializers.ModelSerializer):
class Meta:
model = models.City
fields = '__all__'
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = models.User
fields = '__all__'
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = models.Category
fields = '__all__'
class FoodSerializer(serializers.ModelSerializer):
class Meta:
model = models.Food
fields = '__all__'
class ShopsFoodSerializer(serializers.ModelSerializer):
Foods = FoodSerializer(many=True, read_only=True)
category = CategorySerializer(read_only=True)
city = CitySerializer(read_only=True)
class Meta:
model = models.ShopsFood
fields = '__all__'
نکته : به طور ساده و خلاصه فایل serializers.py برای تبدیل مدل های ما به فرمت json و ساخت Rest Api کمک می کند.

در مرحله بعد به ساخت views.py می پردازیم.

در این فایل ما می خواهیم به مدیریت request و response از سمت کاربر استفاده می شود.

شکل کامل ارتباط برقراری بین سرور و کلاینت
شکل کامل ارتباط برقراری بین سرور و کلاینت

در شکل بالا همان طور که مشاهده می کنید ابتدا یک سرور می سازیم برای مدیریت درخواست ها request و پاسخ ها response استفاده می شود.

در سمت سرور برای ارتباط برقرار کردن با پایگاه داده database ما از django ORM استفاده می کنیم و در بستر فریم ورک جنگو رست Django rest framework این مدیریت را انجام می دهیم و این ارتباط بین وب اپ و پایگاه داده را برقرار می کنیم.

فریم ورک Django rest framework قابلیت مدیریت Rest API را به ما می دهد و ما را قادر می سازد تا بر روی درخواست های

  • GET
  • POST
  • PUT
  • DELETE

مدیریت بسیار خوب و ساده ای انجام دهیم، ویژگی بسیار مهم این تکنولوژی بستر ساده آن است که ما می توانیم بدون پیچیدگی زیاد آن را مدیریت کنیم.



در ادامه به کدهای بخش views.py می پردازیم:

from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework import status
from rest_framework.views import APIView
from . import models
from . import serializers
class UserViewApi(APIView):
def get(self, req: Request):
users = models.User.objects.all()
serializer = serializers.UserSerializer(users, many=True)
return Response(serializer.data, status.HTTP_200_OK)
def post(self, req: Request):
username = req.data.get('username')
password = req.data.get('password')
print({username, password})
try:
user = models.User.objects.get(username=username, password=password)
serializer = serializers.UserSerializer(user)
return Response(serializer.data, status.HTTP_202_ACCEPTED)
except:
return Response(None, status.HTTP_401_UNAUTHORIZED)


User View API
User View API


class CityViewApi(APIView):
def get(self, req: Request):
id = req.query_params.get('id')
if id != None:
cities = models.City.objects.get(pk=int(id))
serializer = serializers.CitySerializer(cities)
else:
cities = models.City.objects.all()
serializer = serializers.CitySerializer(cities, many=True)
return Response(serializer.data, status.HTTP_200_OK)
City Routing
City Routing


class CategoryViewApi(APIView):
def get(self, req: Request):
id = req.query_params.get('id')
if id != None:
try:
categories = models.Category.objects.get(pk=id)
serializer = serializers.CategorySerializer(categories)
except:
return Response(None, status.HTTP_404_NOT_FOUND)
else:
categories = models.Category.objects.all()
serializer = serializers.CategorySerializer(categories, many=True)
return Response(serializer.data, status.HTTP_200_OK)
Category Routing
Category Routing


class ShopsFoodViewApi(APIView):
def get(self, req: Request):
id = req.query_params.get('id')
if id != None:
try:
shopsFood = models.ShopsFood.objects.get(pk=id)
serializer = serializers.ShopsFoodSerializer(shopsFood)
except:
return Response(None, status.HTTP_404_NOT_FOUND)
else:
shopsFood = models.ShopsFood.objects.all()
serializer = serializers.ShopsFoodSerializer(shopsFood, many=True)
return Response(serializer.data, status.HTTP_200_OK)
Shop Food Routing
Shop Food Routing


class FoodViewApi(APIView):
def get(self, req: Request):
id = req.query_params.get('id')
if id != None:
try:
food = models.Food.objects.get(pk=id)
serializer = serializers.FoodSerializer(food)
except:
return Response(None, status.HTTP_404_NOT_FOUND)
else:
food = models.Food.objects.all()
serializer = serializers.FoodSerializer(food, many=True)
return Response(serializer.data, status.HTTP_200_OK)
Food Routing
Food Routing


class SearchApiView(APIView):
def get(self, req: Request):
city_id = req.query_params.get('city')
category_id = req.query_params.get('category')
shopsFood = models.ShopsFood.objects.all()
if city_id != None:
shopsFood = shopsFood.filter(city=city_id)
# filter(category=category_id, city=city_id))
if category_id != None:
shopsFood = shopsFood.filter(category=category_id)
serializer = serializers.ShopsFoodSerializer(shopsFood, many=True)

return Response(serializer.data, status.HTTP_200_OK)

Search Food Routing
Search Food Routing


class SearchFoodApiView(APIView):
def get(self, req: Request):
title = req.query_params.get('title')
foods = models.Food.objects.all()
if title != None:
foods = foods.filter(title__contains=title)
serializer = serializers.FoodSerializer(foods, many=True)
return Response(serializer.data, status.HTTP_200_OK)


در ادامه باید برای مدیریت Rest API های موجود در بخش views.py باید بخش urls.py را بروز رسانی کنیم.

در ادامه به بروزرسانی بخش urls.py می پردازیم:

from django.urls import path
from . import views
urlpatterns = [
# path('api/', include('snappApi.urls'))
path('user/', views.UserViewApi.as_view()),
path('city/', views.CityViewApi.as_view()),
path('city/<int:id>', views.CityViewApi.as_view()),
path('category/', views.CategoryViewApi.as_view()),
path('category/<int:id>', views.CategoryViewApi.as_view()),
path('shopFood/', views.ShopsFoodViewApi.as_view()),
path('shopFood/<int:id>', views.ShopsFoodViewApi.as_view()),
path('food/', views.FoodViewApi.as_view()),
path('food/<int:id>', views.FoodViewApi.as_view()),
path('search/', views.SearchApiView.as_view()),
path('searchFood/', views.SearchFoodApiView.as_view()),
]


در ادامه باید پنل admin فریم ورک Django هم بروزرسانی کنیم تا مدل های ما را شناسایی کند.

در ادامه کدهای بخش admin.py را بروزرسانی می کنیم:

from django.contrib import admin
from .models import City, User, Category, Food, ShopsFood
# Register your models here.
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
list_display = ['username', 'city']
list_filter = ['city']
@admin.register(City)
class CityAdmin(admin.ModelAdmin):
list_display = ['title']
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = ['title']
@admin.register(Food)
class FoodAdmin(admin.ModelAdmin):
list_display = ['title', 'price']
@admin.register(ShopsFood)
class ShopsFoodAdmin(admin.ModelAdmin):
list_display = ['title', 'category']
list_filter = ['category']
تصویر از پنل ادمین Django
تصویر از پنل ادمین Django


در این مرحله بخش back end پروژه تمام می شود.

اکنون شما یک Rest API برای برنامه تحت وب خود دارید که برای مدیریت مدل های

  • City
  • User
  • Category
  • Food
  • ShopsFood

می باشد و می توانیم به راحتی مدل های بالا را مدیریت کنید.

در ادامه به ساخت بخش فرانت اند front end با React.js می پردازیم.



پایتونجنگوpythondjangoapi
Full Stack Developer and Mobile Developer
شاید از این پست‌ها خوشتان بیاید