February 12, 1994
version: "3.9"
services:
postgres:
container_name: postgres_service
image: postgres:14.5
ports:
- "5432:5432"
volumes:
- ./data/db:/var/lib/postgresql/data
environment:
- POSTGRES_NAME=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_HOST_AUTH_METHOD=trust
django:
container_name: django_service
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/server
ports:
- "8000:8000"
environment:
- POSTGRES_NAME=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_HOST=postgres
- POSTGRES_PORT=5432
- GOOGLE_APPLICATION_CREDENTIALS="/server/wooridong-rep-firebase-adminsdk.json"
- BASE_URL=192.168.0.84:8000
- PROTOCOL=http
depends_on:
- "postgres"
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
class UserManager(BaseUserManager):
use_in_migrations = True
def create_user(self, identification, phone_number='', chat_name='', password=None, name=None):
user = self.model(
identification=identification,
phone_number=phone_number,
chat_name=chat_name,
name=name
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, identification, phone_number='', password=None):
user = self.create_user(
identification=identification,
phone_number=phone_number,
password=password
)
user.is_admin = True
user.is_superuser = True
user.is_staff = True
user.save(using=self._db)
return user
class User(AbstractBaseUser, PermissionsMixin):
objects = UserManager()
identification = models.CharField(max_length=30, null=False, unique=True)
name = models.CharField(max_length=10, null=True)
phone_number = models.CharField(max_length=11, null=False)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
date_joined = models.DateTimeField(auto_now_add=True)
fcm_token = models.CharField(max_length=300, null=True)
chat_name = models.CharField(max_length=20, null=True, default='동대표')
USERNAME_FIELD = 'identification'
REQUIRED_FIELDS = ['phone_number']
def __str__(self):
return '{}. {}'.format(self.id, self.identification)
create_user
method.from rest_framework import serializers
from ..models import Villa
from .building_serializer import BuildingSerializer
from .address_serializer import AddressSerializer
class VillaSerializer(serializers.ModelSerializer):
buildings = BuildingSerializer(many=True, read_only=True)
address = AddressSerializer(read_only=True)
class Meta:
model = Villa
fields = '__all__'
depth = 2
fields = '__all__'
from rest_framework import viewsets
from ..models import Villa
from ..serializers import VillaSerializer, VillaCreateSerializer, VillaUpdateSerializer
class VillaViewSet(viewsets.ModelViewSet):
def get_queryset(self):
return Villa.objects.filter(rep=self.request.user)
def get_serializer_class(self):
if self.action == 'create':
return VillaCreateSerializer
if self.request.method == 'PATCH':
return VillaUpdateSerializer
return VillaSerializer
def perform_create(self, serializer):
villa = serializer.save(rep=self.request.user)
return villa
get_queryset
method, and defining
serializer_class or override get_serializer_class
method.class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
"""
A viewset that provides default `create()`, `retrieve()`, `update()`,
`partial_update()`, `destroy()` and `list()` actions.
"""
pass
create(), retrieve(), update(), partial_update(), and list()
methods as default.
Thus, providing queryset and serializer_class, we can use all methods inherited from mixins right
away. But, usually we need to customize some methods. Then we can just override methods to write
our business logic accordingly.from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny
from rest_framework.request import Request
from rest_framework import status
from rest_framework.response import Response
from ..models import User
@api_view(['POST'])
@permission_classes([AllowAny])
def register_view(request: Request):
data = request.data
User.objects.create_user(**data)
return Response(status=status.HTTP_200_OK)
@api_view
decorator that only takes POST method.from django.urls import path,include
from rest_framework.routers import DefaultRouter
from .viewsets import VillaViewSet
from .views import ListAddress, ListAddressDetail, ChangeVillaRep, update_bank
router = DefaultRouter()
router.register('',VillaViewSet, basename='villa')
urlpatterns = [
path('change-rep/', ChangeVillaRep.as_view()),
path('address/',ListAddress.as_view()),
path('address/detail/',ListAddressDetail.as_view()),
path('update-bank/', update_bank),
path('', include(router.urls)),
]
urlpatterns
list.server {
server_name api.wooridong-rep.net;
location / {
proxy_pass http://127.0.0.1:8000;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/api.wooridong-rep.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.wooridong-rep.net/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
server {
if ($host = api.wooridong-rep.net) {
return 301 https://$host$request_uri;
}
server_name api.wooridong-rep.net;
listen 80;
return 404;
}
$ sudo docker compose up -d