Django 13

노마드 코더 에어비앤비 클론 코딩 #16 API TESTING

API Testing: 우리 코드에서 발생할 수 있는 모든 케이스를 작성해놓고 명령어 하나로 테스트하는 것이다. 그 명령어인 'python manage.py test'를 입력하면, 파이썬은 내가 작성한 모든 테스트를 실행한다. APITestCase class 안에 있는 테스트 메소드 명명 규칙: 만약 django가 내 코드를 테스트해주기를 바란다면, 그 테스트 코드는 반드시 'test_'로 시작하는 메소드 안에 작성되어야 한다. 'self.client...'는 우리의 API로 get/post/put/delete request 등을 보낼 수 있게 해준다. 'python manage.py test'는 우리가 만들어둔 DB에서 일어나는게 아니라 새로운 DB를 만들어서 실행하고 테스트가 끝나면 새로 만들어진 D..

노마드 코더 에어비앤비 클론 코딩 #15 AUTHENTICATION

Authentication django는 우리가 바로 사용할 수 있는 인증시스템이 기본으로 있다. 로그인하면 django는 백엔드에서 세션을 생성하고 자동으로 쿠키도 준다. 매번 django 웹사이트를 방문할 때마다, 쿠키는 django로 가고, django는 쿠키를 읽어서 request.user에 user와 쿠키 정보를 함께 넣는다. 이런 기본 인증 시스템이 아닌 직접 커스텀 인증을 만들 수 있다. 이런 방법에는 토큰 인증, JWT인증 등이 있다. Custom Authentication #config/authentication.py from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions impo..

노마드 코더 에어비앤비 클론 코딩 #12 USERS API

User Profile # users/serializers.py class PrivateUserSerializer(ModelSerializer): class Meta: model=User exclude = ( "password", "is_superuser", "id", "is_staff", "is_active", "first_name", "last_name", "groups", "user_permissions", ) #users/ views.py #.../api/v1/users/me 내 프로필만 보는 url class Me(APIView): permission_classes = [IsAuthenticated] #자세한 정보는 로그인한 본인에게만 보여야하므로. def get(self, request): #..

노마드 코더 에어비앤비 클론 코딩 #11 Rest API - 2

SerializerMethodField: Serializer에 커스텀 필드를 추가하는 방법이다. #내 room의 평균 리뷰 점수가 몇인지 #rooms. serializers.py class RoomDetailSerializer(ModelSerializer): owner = TinyUserSerializer(read_only = True) #users.serializers.py에서 만든 serializer amenities = AmenitySerializer(read_only=True,many=True) category = CategorySerializer(read_only=True) rating = serializers.SerializerMethodField() #SerializerMethodField로..

노마드 코더 에어비앤비 클론 코딩 #11 Rest API - 1

All Amenities, Perks Amenity와 Perk도 Category API를 만들 듯이 만들었다. APIView를 쓰면, request.method가 GET인지 POST인지 확인하는 조건문이 필요없다. serializers.py에서 ModelSerializer를 상속받아서 사용하면, 'id', 'created_at', 'updated_at'은 자동으로 read_only로 되어있다. def ... ... if serializer.is_valid(): amenity = serializer.save() #유효하다면 amenity에 저장 return Response(AmenitySerializer(amenity).data) #amenity를 번역하고 데이터 뽑아서 리턴 ... Rooms Rooms는..

노마드 코더 에어비앤비 클론 코딩 #10 Django Rest Framework

@api_view() 유저에게 HttpResponse를 전달하면 안되고, JSON을 전달해야한다. Json에서는 'return JSONResponse({"categories":all_categories})'처럼 변수를 보내면 오류가 난다. 그래서 QuerySet을 JSON포맷으로 변환해야한다. Django Rest Framework를 사용하여 변환할 수 있다. #예 from rest_framework.response import Response from .models import Category @api_view() def categories(request): return Response(...) Serializer: python말로 Django말을 JSON으로 바꿔주고, 반대로 JSON을 Django말..

노마드 코더 에어비앤비 클론 코딩 #9 Urls and Views

Views config 폴더의 'urls.py' : 유저가 특정 url로 접근했을 때, 장고가 해야할 행동에 대해 적혀있다. 각 App 폴더마다 있는 'views.py'는 직접 import해야 사용할 수 있다. 그래서 꼭 이름이 views.py일 필요는 없다. 이를 직접 import하는 방법은 두가지다. ①urls.py에 적어주기 views.py에 함수 작성 # views.py from django.http import HttpResponse def say_hello(request): return HttpResponse('Hello!') -> urls.py에 path 적어주기 # urls.py from room.views import say_hello urlpatterns = [path("rooms",s..

노마드 코더 에어비앤비 클론 코딩 #8 Power Admin

Methods admins.py와 models.py 모두에 function을 정의할 수 있다. 만약 오직 관리자 페이지에서만 function을 사용할 것이라면, admins.py에 정의한다. 만약 관리자 페이지 뿐만 아니라 다른 곳에서도 사용할 것이라면, models.py에 정의한다. Method 만들기 클래스 안에 있는 메서드는 항상 self를 첫번째 매개 변수로 받아야한다. 꼭 self라 할 필요는 없고, 단지 꼭 하나의 초기 매개 변수가 있으면 된다. ⭐'방 리뷰의 평균 보여주기' 메서드 우리의 Room 모델의 review 속성을 가지고 있지 않다. 하지만, review 모델이 room을 가리키므로 Room에서 그 방을 가리키는 모든 review들에 접근할 수 있다. def rating(room):..

노마드 코더 에어비앤비 클론 코딩 #7 ORM

ORM(객체 관계 맵핑): Django를 데이터베이스에 연결. 파이썬을 사용하듯이, 관리자 패널을 통하지 않고 데이터베이스와 '직접' 소통하는 법 Method > Django의 shell 시작: 'python manage.py shell' (Django가 구성된 console이 켜짐) > 우리가 만들었던 Room 모델을 불러옴: 'from rooms.models import Room' > 메서드: Django는 우리가 모델을 만들 때 'objects'라는 속성을 자동으로 부여해줌. objects에는 많은 메서드가 있음. 이를 이용하면 데이터베이스가 Room 모델에서 나온 데이터들을 꺼내오도록 시킬 수 있다. ex) 모든 Room에 접근하고 싶을 때 Room을 import하고 'Room.objects' '..

노마드 코더 에어비앤비 클론코딩 #6 Models and Admin

Models 'models.ImageField'를 사용하려면 터미널에 'poetry add pillow'를 해주어야 한다. #선택지 만들기 class GenderChoices(models.TextChoices): MALE = ("male","Male") #(데이터 베이스에 들어갈 값, 관리자 페이지에서 보게될 label) FEMALE = ("female","Female") gender = models.CharField(max_length=10,choices=GendrChoices.choices) #max_length는 선택지보다 길게,choices=클래스명.choices ManytoManyField: N:M, M:N -> 여러 개의 Amenity들이 여러 Room에 들어갈 수 있는 것처럼 다대다의 관계 ..

728x90