묻고 답해요
147만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현
이 흐름이 맞을까요??
클라이언트에서 카카오 로그인 요청(요청 주소는 loginForm에 있는 a 태그) -> a태그의 redirectUrl로 code가 내려오고 요청폼에 맞춰서 DTO를 만들고 카카오 AccessToken을 발급 받음 -> 그럼 클라이언트는 로그인 완료 -> 그 후 나의 Application을 이용하기 위한 JWT 토큰을 별도로 발급그럼 서버쪽에서는 카카오 로그인이 완료되면 우리쪽의 Application을 이용하기 위한 JWT토큰을 발급해주면 되고, 우리쪽 JWT 토큰을 헤더에 넣어서 요청하면 API를 사용할 수 있다. 해당 흐름이 맞나요? 이렇게 이해하면 될까요?
-
미해결생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현
OpenFeign을 어떤 상황에서 어떻게 사용하는지 감이 안옵니다...
OpenFeign을 어떤 상황에서 어떻게 사용하는지 감이 안옵니다... 단 한번도 프로젝트를 진행하면서 사용해본적이 없는 기술이여서 감이 와닿지 않는데 어떤 상황에서 유용하게 쓸 수 있는 기술인걸까요??
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
django-crispy-form에서 {% include 와 with %}
django-crispy-form에서 {% include 와 with %} 다음과 같이 에러가 나타나고, {% include "_crispy_form.html" %}with 절을 제외하니 정상 동작합니다.정확한 이유는 모르겠으나, 문법이 그 사이에 바뀐 것일 수도 있고 해서 일단 공유하는 마음으로 질문드립니다. 감사합니다.
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
React와 Django-템플릿, HTMX 간의 관계 및 역할에 대한 질문
안녕하세요, 먼저 자세하게 django에 대해 강의해주셔서 감사합니다.강의가 제게 다소 어렵고 양이 방대하여 핵심을 놓치는 부분이 있어 저의 필요와 목적에 의한 질문을 드리게 됐습니다. 핵심적으로 드리고 싶은 질문은 다음과 같습니다.리액트와 django의 관계(리액트 컴포넌트가 적합한 부분, 리액트 컴포넌트에서 장고 템플릿+폼, 뷰와 모델, DB까지의 흐름)리액트 없이 django 기능만 이용하여 datagrid(view), datatable 형식을 사용하는 것이 좋은 방법인지에 대한 강의자님의 의견 django의 템플릿 문법으로 작성된 기본적인 디자인 구성이 된 웹 템플릿을 구하거나 접근하는 방법 웹 개발 숙련도가 매우 미숙하고 질문이 모호해 우선 양해 말씀 구합니다. 상기 질문에 대해서 배경을 부연 설명드립니다. [1번 관련 질의 배경]리액트가 통합된 프로젝트 실습이 todolist 정도인 것 같아서 블로그나 포토로그 등의 앞선 장고 프로젝트에 이를 응용하는게 어렵다고 느껴졌습니다. 혹시 리액트와 django 관계에 대해 조금 더 자세하게 참고할 만한 강의를 짚어주시거나 소스를 알려주실 수 있으실까요? [2번 관련 질의 배경]data-grid / data-table / spreadsheet (표 형태의 데이터를 읽고 수정하는 방식) 형태를 사용하고자 여러 파이썬/장고 라이브러리를 찾아봤으나 pool이 매우 좁고 예시도 매우 부족해 보였습니다. 그러나 react, js 중심으로 프론트 사이드를 구축할 경우 선택지가 매우 다양하고 상태 관리가 안정적일 수 있다는 생각이 들었습니다. (hansongrid, ag grid, MUI datagrid, react datagrid, react spreadsheet grid ...)그리드 어플리케이션 구축은 어떻게 진행하면 좋을까요? [3번 관련 질의 배경]디자인에 소요되는 리소스 측면에서도 장고의 템플릿 문법 보다는 리액트 프레임워크에 적합한 웹사이트 디자인도 더 풍부하고 다양한 것 같습니다. CSS에 상당히 부담을 느껴서 여기에 들이는 노를 줄이고 싶은데 혹시 참고할 만한 사이트나 추천해주시는 방법이 있으실까요? ********답변에 앞서 미리 감사드립니다!********
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
세션 4까지 들었는데, 여기서 DRF로 넘어가도 될까요?
제가 API Server 구축에 더 관심이 가서... 세션 4까지 복습했는데, 바로 DRF로 넘어가도 될까요?
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
13-17 ModelViewSet pytest 오류
안녕하세요 어제에 이어 강의 내용을 따라 가고 있는데요. 강의 내용대로 PostModelViewSet을 선언하고 (영상기준 8분30초까지 진행) pytest를 실행앴더니test_unauthenticated_user_cannot_create_post에서 assert 403 == 400test_non_author_cannot_update_post에서 assert 403 == 200test_nonauthor_cannot_delete_post에서 assert 403 == 204 오류가 각기 발생합니다. 강의를 따라가고 있는데 이런식으로만 오류가 발생하니 원인이 어디인지 찾기가 너무 힘든거 같습니다. 원인이 뭐고 이런 오류를 잡으려면 어떻게 해야할까요?
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
13-16) UpdateAPI test 에러
강의 수강 내용에 따라test_author_can_update_post 와 test_non_author_cannot_update_post를 수행하면 하기의 에러가 발생합니다.list, retrieve, create, destroy 전부 정상 작동하는데 update만 해당 오류가 발생합니다/blog/api.py, line 75, in has_permission if request.method in SAFE_METHODS: NameError: name 'SAFE_METHODS' is not defined 수업 내용대로 따라가고 있는데 ㅠㅠ 오류가 발생한 곳이 어디인지 알 수 가 없습니다.수업 내용을 따라서 구현한 코드는 다음과 같습니다.# blog/tests/test_api.py import base64 import pytest from django.core.exceptions import ObjectDoesNotExist from django.urls import reverse from rest_framework import status from rest_framework.response import Response from rest_framework.test import APIClient from accounts.models import User from accounts.tests.factories import UserFactory from blog.models import Post from blog.tests.factories import PostFactory def create_user(raw_password: str = None) -> User: """새로운 User 레코드를 생성 및 반환""" return UserFactory(raw_password=raw_password) def get_api_client_with_basic_auth(user: User, raw_password: str) -> APIClient: """인자의 User 인스턴스와 암호 기반에서 Basic 인증을 적용한 APIClient 인스턴스 반환""" # *.http 파일에서는 자동으로 base64 인코딩을 수행해줬었습니다. base64_data: bytes = f"{user.username}:{raw_password}".encode() authorization_header: str = base64.b64encode(base64_data).decode() client = APIClient() client.credentials(HTTP_AUTHORIZATION=f"Basic {authorization_header}") return client @pytest.fixture def unauthenticated_api_client() -> APIClient: """Authorization 인증 헤더가 없는 기본 APIClient 인스턴스 반환""" return APIClient() @pytest.fixture def api_client_with_new_user_basic_auth(faker) -> APIClient: """새로운 User 레코드를 생성하고, 그 User의 인증 정보가 Authorization 헤더로 지정된 APIClient 인스턴스 반환""" raw_password: str = faker.password() user: User = create_user(raw_password) api_client: APIClient = get_api_client_with_basic_auth(user, raw_password) return api_client @pytest.fixture def new_user() -> User: """새로운 User 레코드를 생성 및 반환""" return create_user() @pytest.fixture def new_post() -> Post: """새로운 Post 레코드를 반환""" return PostFactory() @pytest.mark.it("작성자가 아닌 유저가 수정 요청하면 거부") @pytest.mark.django_db def test_non_author_cannot_update_post(new_post, api_client_with_new_user_basic_auth): url = reverse("api-v1:post_edit", args=[new_post.pk]) response: Response = api_client_with_new_user_basic_auth.patch(url, data={}) assert status.HTTP_403_FORBIDDEN == response.status_code @pytest.mark.it("작성자가 수정 요청하면 성공") @pytest.mark.django_db def test_author_can_update_post(faker): raw_password = faker.password() author = create_user(raw_password=raw_password) created_post = PostFactory(author=author) url = reverse("api-v1:post_edit", args=[created_post.pk]) api_client = get_api_client_with_basic_auth(author, raw_password) data = {"title": faker.sentence()} response: Response = api_client.patch(url, data=data) assert status.HTTP_200_OK == response.status_code assert data["title"] == response.data["title"] ## core/mixins.py from typing import List, Optional, Type from colorama import Fore from django.conf import settings from django.db.models import Model, QuerySet from rest_framework import permissions from rest_framework.renderers import BrowsableAPIRenderer, JSONRenderer from rest_framework.request import Request from rest_framework.response import Response from rest_framework.serializers import Serializer from rest_framework.utils.serializer_helpers import ReturnDict from rest_framework.views import APIView from core.permissions import make_drf_permission_class class JSONResponseWrapperMixin: def finalize_response( self, request: Request, response: Response, *args, **kwargs ) -> Response: is_ok = 200 <= response.status_code < 400 accepted_renderer = getattr(request, "accepted_renderer", None) if accepted_renderer is None or response.exception is True: response.data = { "ok": is_ok, "result": response.data, } elif isinstance( request.accepted_renderer, (JSONRenderer, BrowsableAPIRenderer) ): response.data = ReturnDict( { "ok": is_ok, "result": response.data, # ReturnList }, serializer=response.data.serializer, ) return super().finalize_response(request, response, *args, **kwargs) class PermissionDebugMixin: if settings.DEBUG: def get_label_text(self, is_permit: bool) -> str: return ( f"{Fore.GREEN}Permit{Fore.RESET}" # colorama 라이브러리 활용 if is_permit else f"{Fore.RED}Deny{Fore.RESET}" ) def check_permissions(self, request: Request) -> None: print(f"{request.method} {request.path} has_permission") for permission in self.get_permissions(): is_permit: bool = permission.has_permission(request, self) print( f"\t{permission.__class__.__name__} = {self.get_label_text(is_permit)}" ) if not is_permit: self.permission_denied( request, message=getattr(permission, "message", None), code=getattr(permission, "code", None), ) def check_object_permissions(self, request: Request, obj: Model) -> None: print(f"{request.method} {request.path} has_object_permission") for permission in self.get_permissions(): is_permit: bool = permission.has_object_permission(request, self, obj) print( f"\t{permission.__class__.__name__} = {self.get_label_text(is_permit)}" ) if not is_permit: self.permission_denied( request, message=getattr(permission, "message", None), code=getattr(permission, "code", None), ) class TestFuncPermissionMixin: TEST_FUNC_PERMISSION_CLASS_NAME = "TestFuncPermissionMixin" @classmethod def get_test_func_permission_instance(cls) -> permissions.BasePermission: permission_class = make_drf_permission_class( class_name=cls.TEST_FUNC_PERMISSION_CLASS_NAME, # *_test_func_name 속성이 지정되면, 이 권한 클래스가 사용된 APIView 클래스에서 # 지정 이름의 메서드를 찾습니다. has_permission_test_func_name="has_permission", has_object_permission_test_func_name="has_object_permission", ) return permission_class() def get_permissions(self) -> List[permissions.BasePermission]: # 기존 permission_classes 설정에 권한 정책을 추가하는 방식으로 동작 return super().get_permissions() + [self.get_test_func_permission_instance()] def has_permission(self, request: Request, view: APIView) -> bool: return True def has_object_permission( self, request: Request, view: APIView, obj: Model ) -> bool: return True
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
13-14 pytest 코드 실행 오류
질문을 온전히 이해할 수 있도록, 모든 맥락을 전달해주세요.질문은 질문자가 번거로워야 보다 좋은 답변을 얻으실 수 있습니다.시행착오를 알려주시면 곧바로 원하는 문제에 집중할 수 있습니다.오류 메시지는 일부만 알려주시기보다 전체 오류 메시지를 캡처해서 주시면, 오류 파악에 도움이 됩니다. 당신의 파이썬/장고 페이스메이커가 되겠습니다. ;-)인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. postgresql 을 다른 서버에 연결하여 사용중인데요.runserver 시에는 정상 작동하나 강사님이 올려주신 pytest를 똑같이 설정하고 실행하면, schema가 없어서 table을 생성할 수 없다는 오류가 발생합니다.MigrationSchemaMissing("Unable to create the django_migrations table 일단은 settings.py를 sqlite3로 변경하여 정상 작동은 시켰는데요 어떻게 수정할 수 있을까요? 또한 올려주신 소스코드에서import factory from accounts.models import User class UserFactory(factory.django.DjangoModelFactory): class Meta: model = User django_get_or_create = ("username",) username = factory.Sequence(lambda n: f"user{n}") email = factory.LazyAttribute(lambda user: f"{user.username}@example.com") # UserFactory 인스턴스 생성 시에, 암호 입력을 지원하기 위함 # raw_password 필드가 아니라 password 필드로 지정하면, 암호화없이 입력값 그대로 저장됩니다. raw_password = factory.Faker("password") @classmethod def _create(cls, model_class, *args, **kwargs): # raw_password 필드값을 암호화하여 password 필드에 저장합니다. # User 모델에는 raw_password 이름의 필드가 없으므로 kwargs 사전에서 제거해줘야만 합니다. raw_password = kwargs.pop("raw_password", None) if raw_password: kwargs["password"] = make_password(raw_password) return super()._create(model_class, *args, **kwargs)make_password 부분이 import 되어 있지 않습니다. git에서는 수정되어 있는 모양인데 참고 부탁드립니다.
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
conda-forge postgresql 과 multithreading
강의에서 설명하지 않으신 내용인데요 가능한지 궁금하여 여쭈어봅니다.Conda-forge 내에 postgresql package가 있습니다. (Postgresql | Anaconda.org)물론 서비스 시에는 database 서버를 따로 두는게 좋다는건 수업 때 설명으로 이해하였습니다. 그러나 실 서비스 시 postgresql를 사용할 것이라면 개발 시에 sqlite 대신 위 package를 사용하는게 만약 더 적합할까요?배포 과정 설명 시에 로드 밸런서가 작업을 서버에 할당해준다고 설명해 주셨는데, 보아하니 각 작업을 싱글 쓰레드로 할당하는 것 처럼 보였습니다. 장고의 경우 View 단에 multithread로 작업할 내용이 있다면, 어떻게 처리해야 하나요?
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
템플릿 관련 질문입니다.
안녕하세요 강사님.템플릿이 명확하게 정의가 되지 않는데, 혹시 템플릿 한번만 정의해주시면 안될까요, 저는 지금 두리뭉실하게만 머리속에 있습니다..질문 받아주셔서 감사합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part6: 웹 서버
LING #1 에서.. 서버 GC문제
요즘도 여전히 LINQ는 GC문제를 야기할 가능성이 있어 UNITY에서는 피하는 편입니다. 서버의 경우 GC를 끄고 점검때 재부팅하는식으로 뭐 좀 쌓이든 비효율적이든 대충 뭉개고 갔었었고요. 유니티는 뭐 저사양 기기도 생각해야 하니 여전히 저럴 것이고서버에서 최신 사양의 C# 버전을 택했을때 LINQ가 메모리 문제를 야기할 가능성은 없나요... 음...애초에 저런거 일일이 잡느니 램증설각이 보이긴 하네요
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
cover_image_tag(self) 부분 질문이 있습니다.
안녕하세요 강사님.인자로 받는 self는 그 c++의 this 포인터 같은 개념으로 보면 될까요, 그리고 list_display 안에 cover_image를 cover_image_tag로 바꿨는데 처음에 cover_image는 같은 클래스(SongAdmin)에 있는 함수라 list_display에서 사용가능한거고, cover_image_tag는 models 파일 안에 Song 클래스 안에 있는 함수라 list_display에서 사용이 가능한걸까요? 감사합니다.
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
[11-30] 강의 crispy form 적용에서 오류가 발생해서 관련 문의 드립니다.
강사님 안녕하세요,HTMX와 모달을 활용한 댓글 기능을 구현하는 코드 작성 중에 crispy form이 적용이 되지 않고 오류가 발생해서 문의드립니다.작성하고 있던 코드는 _comment_form.html 파일의 코드입니다아래 이미지는 발생한 에러 내용입니다. comment_form.html 파일의 코드를 구현하고 로컬호스트에 띄운 개별 Note 페이지의 하단에 '댓글 쓰기' 버튼을 클릭했을 때, crispy form이 렌더링 되지 않고 위와 같은 에러가 발생하는 케이스입니다. 제가 추측하는 것은 context 변수에 담긴 데이터에 문제가 있어서, flatten() 메서드가 동작하지 않아 발생하는 에러 같다고 생각하는데요. 해결하는 방법에 대해 알려주시면 감사하겠습니다! 감사합니다 🙂
-
미해결(2024 최신 업데이트)리액트 : 프론트엔드 개발자로 가는 마지막 단계
전체 소스코드는 어디서 받을 수 있나요?
전체 소스코드는 어디서 받을 수 있나요?
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
models.py와 _song.html의 연결에 대해서 질문있습니다.
안녕하세요 강사님.보면 _song.html에서 models.py의 class song:을 가져다 쓰는것같습니다. {{ song.like_count }}html 파일안에서 이런식으로 쓰이는것같은데, 어떻게 연결을 시켰는지 알수있을까요?감사합니다.
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
각 섹션의 강의 목표을 알고 싶습니다.
안녕하세요 강사님, 강사님 강의는 다른 강사님들 강의와는 다르게먼저 한번 전체적으로 다뤄주고나서 나중에 세세히 강의해주시는것 같습니다. 지금 장고핵심기능 리뷰를 보고 있는데, 각 섹션마다 수강생들이 어떤 부분을 염두하고 보면 좋은지를 알려주시면, 혹은 어떤 목적으로 섹션을 나눴는지를 알려주시면 제가 강의를 이해하고 앞으로 강의를 듣는데 좀더 이해가 잘 될거같습니다.감사합니다.
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
외래키 관계라는게 무슨 의미인지 잘 모르겠습니다.
안녕하세요 강사님.post 모델과 코멘트, 즉, post 테이블과 코멘트는 외래키 관계라고 설명해주셨는데, 제가 db용어를 잘 모르고, 찾아봐도 와닿지 않아서 이해가 잘 되지 않았습니다. 감사합니다.
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
7-30 질문합니당!!!
제가 유저들끼리 커뮤니티 만들고자 하는데 이때부터 강의 보면 될까요? 여러가지 다 보고있는데 어디서부터 딱 봐야할지 모르겠습니다.! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
커리큘럼 관련 문의드립니다.
안녕하세요!먼저 좋은 강의 제공해주셔서 감사드립니다. 이번에 프로젝트로 FE는 React, BE는 Django로 진행하게 되었고, 제가 Django를 맡게 되어 해당 강의를 수강 중에 있습니다. 커리큘럼을 보다보니 아래 처럼 Django로 FE부분도 구현하는 섹션들이 있는데요!섹션 (8) 장고 Form을 활용한 생산성 높은 입력폼 처리섹션 (10) 장고 주도의 웹 프론트엔드 기술과 웹 컴포넌트섹션 (11) (포토로그 프로젝트) 장고 중심의 웹 서비스 개발하기 물론 나중에는 다 듣겠지만.. 아무래도 시간이 한정되어 있어, Django로 BE만 구현한다고 했을 때 이러한 섹션들도 필수적으로 들어야 하는 것인지 궁금합니다. 예를들면 이후 강의를 수강하려면 앞 강의가 필수적이여야 한다던지 등의 사유가 있을 것 같습니다. 만약에 프로젝트만을 위해서 일단 스킵 가능하다면, 이외에도 혹시 스킵 가능한 섹션이 있는지 문의드립니다!좋은 강의 만들어주셔서 감사합니다~!
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
커스텀 DateConverter
커스텀 DateConverter04-03 강의 링크가 잘못되어 있는 것 같습니다!!