묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결작정하고 장고! Django로 Pinterest 따라만들기 : 바닥부터 배포까지
static 파일 중 jpg 파일만 로드 불가
58강에서 static 파일 중 jpg 파일만 적용되지 않고 있습니다 css,js 파일은 잘 적용이 됩니다 뭐가 문제일 까요 ?
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
장고로 웹뷰앱 가능할까요?
안녕하세요 강사님,대전에서 강의를 열심히 듣고 있는 수강생입니다 :)모바일 서비스로 창업을 준비하고 있는데... 과연 장고로 커버가 될까 여쭈어봅니다. 우선은 허접한 웹사이트는 만들어두었습니다. (jasol.co.kr)궁극적으로는 유저들에게 푸시 알림을 보내고 싶기 때문에 웹이 아니라 '앱' 환경으로 나아가야겠지요. [질문1]C, Java언어가 친숙한 저에겐 react문법은 너무나 해괴해서 빠르게 시작을 못 하겠더라고요;javascript와 django로만 구현을 했고, 최종적으로는 flutter를 이용해서 웹뷰로만 구현을 하려고 합니다. 근데 제가 해보질 않아서, 이게 될 지 궁금하더라고요. flutter로 겉 껍데기만 만들고, 결국 웹브라우징을 하되, 앱 푸시 기능은 있게 만드는 거죠(장고의 REST framework를 사용하면 구현은 가능할 거 같은데, 맞죠? 제가 거기까진 못 가봐서 ㅠㅜ) 제가 자주 이용하는 yes24 서점앱도 보면 순수 자바스크립트에다가 웹뷰로 싸놓은 것 같았어요. 하지만 푸쉬 알림도 잘 오고요. 이렇게 구현하는 경우도 흔한가요? 토스앱도 대부분 웹뷰로 알고 있는데, 제가 생각하는 서비스는 성능이 중요하지 않은 서비스라서...(예전엔 PWA를 써서 웹을 앱으로 만들었던 거 같은데 요즘은 또 그렇게 하지 않은 것 같더라고요.)요약하자면, django로 웹사이트 구현하고, flutter나 RN으로 웹뷰 구현, 충분히 가능한 얘긴지? [질문2] 웹앱을 꼭 써야하는 지...요즘은 리액트가 대세라는 걸 정말 잘 알고 있습니다. 웹앱이 주는 편리함이 뭘까 생각해봤을 때, 화면전환할때 '깜빡'하는 게 없고 로딩을 초반에 다 해놓는다는것 말고는 크게 와닿는게 없더라고요. 거꾸로 제가 리액트를 새롭게 배워서 구현하기엔 시간이 지연되는 것 같아 괴롭습니다. 웹앱을 꼭 써야만 하는걸까요? yes24 앱도 화면전환할 때 깜빡~ 하고 페이지 로딩하던데 저는 크게 불편함을 못 느끼거든요. [질문3] 혹시 ask컴퍼니에...가끔 서대전역에 갈 일이 있는데, 강사님께 얼굴 비추러 가도 되나요? 바쁘신분 붙잡고 시간 뺏고 싶지는 않고 가끔 조언같은거 구할 때 10분만이라도 얘기하면 길이 생길 거 같은데 ㅠㅜ... 네이버지도에 있는 ask컴퍼니 전화번호에 미리 전화드리고 방문드려도 괜찮을까요?
-
미해결파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
썸네일 적용하면 쿼리수가 369로 늘어나요
{% extends "mall/base.html" %} {% load humanize %} {% load thumbnail %} {% block content %} <div class="row"> {% for product in product_list %} <div class="col-sm-6 col-lg-4"> <div class="card"> {% thumbnail product.photo "300x300" crop="center" as thumb %} <img src="{{ thumb.url }}" alt="{{ product.name }} 사진" class="card-img-top object-fit-cover"/> {% endthumbnail %} <div class="card-body"> {{ product.category.name }} <div> <h5 class="text-truncate">{{ product.name }}</h5> </div> <div class="d-flex justify-content-between"> <div>{{ product.price|intcomma }}원</div> <div> <a href="#" class="btn btn-primary">장바구니에 담기</a> </div> </div> </div> </div> </div> {% endfor %} </div> {% endblock %}
-
미해결우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original)
가상 환경 질문
안녕하세요가상환경 실행에 대해 질문이 있습니다.강의를 들으면서 vscode를 실행할 때마다 매번 cmd로 가상환경을 activate하고 끝날 때 deactivate 하는 과정을 거쳐야 하나요?
-
미해결작정하고 장고! Django로 Pinterest 따라만들기 : 바닥부터 배포까지
58강 static 파일 적용 안됨
58강 에서 어디를 잘못해서 staic 파일이 적용이 안되는지 잘 모르겠네요git 주소 : https://github.com/Kimhyuntae9665/pragmatic.gitportainer 스크린샷 입니다문제가 보이면 댓글 부탁 드려요 ㅠㅠ 혹시 aws 로 하고 있는데 aws 라서 문제가 생긴걸까요? 찾아 주시는 분에게는 사례하겠습니다 !!!!! 정말 모르겠네요ㅠㅠㅠㅠㅠㅠ
-
해결됨실리콘밸리 엔지니어가 가르치는 파이썬 장고 웹프로그래밍
VSCode Django-html 상태에서 inline-css 자동완성이 혹시 되시나요?
inline으로 css를 적용하려고 하니까, 자동완성이 안돼서 불편한데, 방법을 찾아봐도 모르겠어서 여쭈어봅니다.
-
미해결Django REST Framework 핵심사항
like 기능을 위한 overriding 문의
안녕하세요 강사님!강의 재미있게 보면서 공부하고 있습니다.PostLikeAPIView에 대한 overriding 관련 문의드립니다.class PostLikeAPIView(UpdateAPIView): queryset = Post.objects.all() serializer_class = PostLikeSerializer # PATCH method def update(self, request, *args, **kwargs): partial = kwargs.pop('partial', False) instance = self.get_object() # data = instance.like + 1 data = {'like': instance.like + 1} serializer = self.get_serializer(instance, data=data, partial=partial) serializer.is_valid(raise_exception=True) self.perform_update(serializer) if getattr(instance, '_prefetched_objects_cache', None): # If 'prefetch_related' has been applied to a queryset, we need to # forcibly invalidate the prefetch cache on the instance. instance._prefetched_objects_cache = {} # return Response(serializer.data) return Response(data['like'])강의 내용 중에 위 괕이 오버라이딩 하는 로직이 있었는데요. # views.py class PostLikeAPIView(UpdateAPIView): queryset = Post.objects.all() serializer_class = PostLikeSerializer def patch(self, request, *args, **kwargs): instance = self.get_object() request.data['like'] = instance.like + 1 super().patch(request, *args, **kwargs) return Response(request.data['like']) # serializers.py class PostLikeSerializer(serializers.ModelSerializer): class Meta: model = Post fields = ['like'] 이런 식으로 해도 같은 결과를 얻을 수 있을 수 있었습니다.이렇게한 의도는 update method를 overriding 하는 거보다 patch method를 overriding 할 때 비즈니스 로직 코드가 더 짧으니 실수가 적지 않을까 해서 입니다.제가 적은대로 사용하는 것도 유효한지, 어떤 단점이 있을지 잘 생각이 안나서 문의드립니다.강의 감사하게 보고있습니다.항상 건강하시길 바라겠습니다^^
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
azure 에서 컨테이너 이미지의 버전을 바꾸다 보면 application error 발생
web app에 컨테이너 이미지를 올리고예를들어, askcompany/project:0.1 이미지에 대해서는 잘 작동하였고코드에 수정할 부분이 있어서askcompany/project:0.2로 새롭게 빌드를 하였고azure web app 의 배포센터에서 컨테이너 이미지를askcompany/project:0.2로 수정하고 다시 시작 후 도메인 주소로 들어가면 application error화면이 나타나며 서버가 돌아가지 않습니다.그래서 새롭게 web app을 만들면서 컨테이너 이미지를 바꿔주었는데... 잘 작동하면 왜 그런걸까요?? 사진을 추가하였습니다!
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
azure web app에서 배포가 계속 안됩니다...
azure web app을 통해 배포를 하던중 계속해서 오류가 발생하였습니다.처음에는/usr/local/bin/gunicorn: exec format error에러가 발생하여 제가 m1 맥북을 사용하다보면, 맥북에서 빌드한 이미지가, 서로 다른 CPU 아키텍처로 인해 서버 에러가 발생할 수 있다는 것을 알게되어 buildx을 이용하여위와 같이 설정을 하였으나 여전히 에러가 발생합니다.local에서는 아무런 문제없이 작동하나 azure에서만 문제가 발생하여 데이터베이스연결과 storage연결까지는 아무런 문제가 없었습니다.로컬에서 실행할 때는 아래와 같이 실행하였습니다.docker run --rm --publish 9999:80 \ -e DJANGO_SETTINGS_MODULE=backend.settings.prod \ -e AZURE_ACCOUNT_NAME=capstonboom \ -e AZURE_ACCOUNT_KEY="필요하시면 따로 알려드리겠습니다..." \ -e ALLOWED_HOSTS=localhost \ -e DB_HOST=capstonproject.postgres.database.azure.com \ -e DB_USER=gunhong@capstonproject \ -e DB_PASSWORD="비밀번호" \ -e DB_NAME=postgres \ keonhong/capstonproject:0.1도커파일은 아래와 같이 설정했습니다.FROM ubuntu:20.04 RUN apt-get update && apt-get install -y python3-pip && apt-get clean WORKDIR /djangoproject ADD . /djangoproject RUN pip3 install -r requirements.txt RUN which gunicorn || echo gunicorn not found EXPOSE 8000 CMD ["gunicorn", "backend.wsgi:application", "--bind", "0.0.0.0:80"]우분투 버전과 guncorn버전이 호완이 안될까 생각해서gunicorn==20.0.4 을 이용하였습니다.위와 같이 한 후 도커 허브의 레지스토리와 azure app web을 모두 삭제하고 새롭게 시작했더니/usr/local/bin/gunicorn: exec format error이 에러는 발생하지 않으나 여전히Logging is not enabled for this container.에러메세지는 출력됩니다... gunicorn 문제로 인해Logging is not enabled for this container. 도 함께 출력되었는지 생각했으나 또 다른 문제였나 봅니다...
-
미해결작정하고 장고! Django로 Pinterest 따라만들기 : 바닥부터 배포까지
49강 ngnix Deploy the container 500 error
강사님 ngnix를 deploy the comtainer 를 누르면 500Faliure이 뜨네요 어떻게 해결할 수 있을까요 ?
-
미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
self.client.post에 글이 생성되지않습니다
강의 영상과 똑같이 작성했음에도 last_post의 내용이 client가 생성한 post가 아닌, post_003의 내용이 들어가면서 Failed가 발생합니다.실행결과 Failedself.assertEqual(last_post.title, 'Post Form 만들기')AssertionError: '세 번째 포스트 입니다.' != 'Post Form 만들기'- 세 번째 포스트 입니다.+ Post Form 만들기[test.py 코드]from time import sleep from django.test import TestCase, Client from bs4 import BeautifulSoup from .models import Post, Category, Tag from django.contrib.auth.models import User class TestView(TestCase): def setUp(self): self.client = Client() # 사용자 생성 self.user_yunju = User.objects.create_user( username='yunju', password='0129' ) self.user_subin = User.objects.create_user( username='subin', password='cute0313' ) self.user_yunju.is_staff = True self.user_yunju.save() # 카테고리 생성 self.category_programming = Category.objects.create( name='programming', slug='programming' ) self.category_music = Category.objects.create( name='music', slug='music' ) # 태그 생성 self.tag_python_kar = Tag.objects.create( name="파이썬 공부", slug='파이썬-공부' ) self.tag_python = Tag.objects.create( name="python", slug='python' ) self.tag_django = Tag.objects.create( name="django", slug='django' ) # 포스트 생성 self.post_001 = Post.objects.create( title="첫 번째 포스트 입니다.", content="Hello World! We are the World", author=self.user_yunju, category=self.category_programming ) self.post_001.tags.add(self.tag_django) self.post_002 = Post.objects.create( title="두 번째 포스트 입니다.", content="저는 마라탕과 떡볶이를 사랑합니다", author=self.user_subin, category=self.category_music ) self.post_003 = Post.objects.create( title="세 번째 포스트 입니다.", content="Category가 없는 포스트입니다.", author=self.user_subin ) self.post_003.tags.add(self.tag_django) self.post_003.tags.add(self.tag_python) # 내비게이션바 함수 def navbar_test(self, soup): navbar = soup.nav self.assertIn('Blog', navbar.text) self.assertIn('Blog', navbar.text) logo_btn = navbar.find('a', text='Do It Django') self.assertEqual(logo_btn.attrs['href'], '/') home_btn = navbar.find('a', text='Home') self.assertEqual(home_btn.attrs['href'], '/') blog_btn = navbar.find('a', text='Blog') self.assertEqual(blog_btn.attrs['href'], '/blog/') about_me_btn = navbar.find('a', text='About me') self.assertEqual(about_me_btn.attrs['href'], '/about_me/') # 카테고리 카드 함수 def category_card_test(self, soup): categories_card = soup.find('div', id='categories-card') self.assertIn('Categories', categories_card.text) self.assertIn( f'{self.category_programming}({self.category_programming.post_set.count()})', categories_card.text ) self.assertIn( f'{self.category_music}({self.category_music.post_set.count()})', categories_card.text ) self.assertIn( f'미분류({Post.objects.filter(category=None).count()})', categories_card.text ) # 포스트가 있는 경우 def test_post_list_with_posts(self): self.assertEqual(Post.objects.count(), 3) response = self.client.get('/blog/') self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') self.assertIn('Blog', soup.title.text) self.navbar_test(soup) self.category_card_test(soup) main_area = soup.find('div', id='main-area') post_001_card = main_area.find('div', id='post-1') self.assertIn(self.post_001.title, post_001_card.text) self.assertIn(self.post_001.category.name, post_001_card.text) self.assertIn(self.tag_django.name, post_001_card.text) self.assertNotIn(self.tag_python.name, post_001_card.text) self.assertNotIn(self.tag_python_kar.name, post_001_card.text) post_002_card = main_area.find('div', id='post-2') self.assertIn(self.post_002.title, post_002_card.text) self.assertIn(self.post_002.category.name, post_002_card.text) self.assertNotIn(self.tag_django.name, post_002_card.text) self.assertNotIn(self.tag_python.name, post_002_card.text) self.assertNotIn(self.tag_python_kar.name, post_002_card.text) post_003_card = main_area.find('div', id='post-3') self.assertIn(self.post_003.title, post_003_card.text) self.assertIn('미분류', post_003_card.text) self.assertIn(self.tag_django.name, post_003_card.text) self.assertIn(self.tag_python.name, post_003_card.text) self.assertNotIn(self.tag_python_kar.name, post_003_card.text) self.assertIn(self.post_001.author.username.upper(), main_area.text) self.assertIn(self.post_002.author.username.upper(), main_area.text) # 포스트가 없는 경우 def test_post_list_without_posts(self): Post.objects.all().delete() self.assertEqual(Post.objects.count(), 0) response = self.client.get('/blog/') self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') self.navbar_test(soup) self.assertIn('Blog', soup.title.text) main_area = soup.find('div', id='main-area') self.assertIn('아직 게시물이 없습니다.', main_area.text) # 상세페이지 함수 def test_post_detail(self): self.assertEqual(Post.objects.count(), 3) self.assertEqual(self.post_001.get_absolute_url(), '/blog/1/') response = self.client.get(self.post_001.get_absolute_url()) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') self.navbar_test(soup) self.category_card_test(soup) self.assertIn(self.post_001.title, soup.title.text) main_area = soup.find('div', id='main-area') post_area = main_area.find('div', id='post-area') self.assertIn(self.post_001.title, post_area.text) self.assertIn(self.post_001.category.name, post_area.text) self.assertIn(self.user_yunju.username.upper(), post_area.text) self.assertIn(self.post_001.content, post_area.text) self.assertIn(self.tag_django.name, post_area.text) self.assertNotIn(self.tag_python.name, post_area.text) self.assertNotIn(self.tag_python_kar.name, post_area.text) # 카테고리별 페이지 나타내는 함수 def test_category_page(self): response = self.client.get( self.category_programming.get_absolute_url()) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') self.navbar_test(soup) self.category_card_test(soup) main_area = soup.find('div', id='main-area') self.assertIn(self.category_programming.name, main_area.h1.text) self.assertIn(self.category_programming.name, main_area.text) self.assertIn(self.post_001.title, main_area.text) self.assertNotIn(self.post_002.title, main_area.text) self.assertNotIn(self.post_003.title, main_area.text) # 태그 페이지를 나타내는 함수 def test_tag_page(self): response = self.client.get(self.tag_django.get_absolute_url()) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') self.navbar_test(soup) self.category_card_test(soup) self.assertIn(self.tag_django.name, soup.h1.text) main_area = soup.find('div', id='main-area') self.assertIn(self.tag_django.name, main_area.text) self.assertIn(self.post_001.title, main_area.text) self.assertNotIn(self.post_002.title, main_area.text) self.assertIn(self.post_003.title, main_area.text) # 로그인하지 않은 사용자에 대한 폼 제한 함수 def test_create_post_without_login(self): response = self.client.get('/blog/create_post/') self.assertNotEqual(response.status_code, 200) # 폼(form)을 이용한 포스트 작성 페이지 생성 # 로그인한 사용자만 폼 작성 가능 def test_create_post_with_login(self): self.client.login(username='yunju', password='0129') response = self.client.get('/blog/create_post/') self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') self.assertEqual('Create Post - Blog', soup.title.text) main_area = soup.find('div', id='main-area') self.assertIn('Create a New Post', main_area.text) self.client.post( '/blog/create_post/', { 'title': 'Post Form 만들기', 'content': 'Post Form 페이지를 만듭시다.', }, ) last_post = Post.objects.last() self.assertEqual(last_post.title, 'Post Form 만들기') self.assertEqual(last_post.author.username, 'yunju') self.assertEqual(last_post.content, 'Post Form 페이지 만들어보자!')[views.py 코드]from django.core.exceptions import PermissionDenied from django.shortcuts import render, redirect from django.views.generic import ListView, DetailView, CreateView, UpdateView from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from .models import Post, Category, Tag # 리스트를 출력하는 django 기본 라이브러리 class PostList(ListView): model = Post ordering = '-pk' def get_context_data(self, **kwargs): context = super(PostList, self).get_context_data() context['categories'] = Category.objects.all() context['no_category_post_count'] = Post.objects.filter( category=None).count() return context # 하나의 리스트를 불러오는 django 기본 라이브러리 class PostDetail(DetailView): model = Post def get_context_data(self, **kwargs): context = super(PostDetail, self).get_context_data() context['categories'] = Category.objects.all() context['no_category_post_count'] = Post.objects.filter( category=None).count() return context # 포스트 생성 함수 class PostCreate(LoginRequiredMixin, UserPassesTestMixin, CreateView): model = Post fields = ['title', 'hook_text', 'content','head_image', 'file_upload', 'category'] def test_func(self): return self.request.user.is_superuser or self.request.user.is_staff def form_valid(self, form): current_user = self.request.user if current_user.is_authenticated and (current_user.is_staff or current_user.is_superuser): form.instance.author = current_user return super(PostCreate, self).form_valid(form) else: return redirect('/blog/') class PostUpdate(LoginRequiredMixin, UpdateView): model = Post fields = ['title', 'hook_text', 'content','head_image', 'file_upload', 'category'] template_name = 'blog/post_update_form.html' def dispatch(self, request, *args, **kwargs): if request.user.is_authenticated and request.user == self.get_object().author: return super(PostUpdate, self).dispatch(request, *args, **kwargs) else: return PermissionDenied # 카테고리별 페이지 반환 함수 def category_page(request, slug): if slug == 'no_category': category = '미분류' post_list = Post.objects.filter(category=None) else: category = Category.objects.get(slug=slug) post_list = Post.objects.filter(category=category) return render( request, 'blog/post_list.html', { 'post_list': post_list, 'categories': Category.objects.all(), 'no_category_post_count': Post.objects.filter(category=None).count(), 'category': category } ) # 태그별 페이지 반환 함수 def tag_page(request, slug): tag = Tag.objects.get(slug=slug) post_list = tag.post_set.all() return render( request, 'blog/post_list.html', { 'post_list': post_list, 'categories': Category.objects.all(), 'no_category_post_count': Post.objects.filter(category=None).count(), 'tag': tag } )
-
미해결파이썬으로 장고(Django) 공략하기: 입문
uWSGI 세팅하기_ 최종 502 bad gateway error
여기까지 그럭저럭 잘 따라오고 있었는데요.aws 의 탄력적ip: 8000/third/list 까지는 웹페이지도 잘 동작되고요.근데 uWSGI로 최종적으로sudo service nginx reload 를 하고탄력적ip/third/list를 하니 '502 bad gateway ' 에러가나네요. ㅡㅡ; 탄력적ip 만 해도 동일한 에러가 나구요. 순서대로 몇번을 확인해보고 있는데요.vi uwsgi.inisudo vi /etc/nginx/nginx.confsudo vi /etc/nginx/sites-enabled/default 어떤 걸 더 확인해봐야 할지 모르겠습니다.
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
트랜스파일링
2강 14분쯤const add = (x=10, y=20) => x + y + 10console.log(add(1))이 코드는 x = 1, y = 20 해서 31이 출력되야 하는거 아닌가요?
-
미해결파이썬으로 장고(Django) 공략하기: 입문
putty 접속관련
안녕하세요. 원래 그대로 따라한다고 생각하고 했었는데 ubuntu로 하면서 페어키를 입력하니 서버 거부가 나와서 이틀동안 원인을 찾다보니... 선택한 서버타입과 로그인 아이디가 달라서 안됬었던 거네요. Amazon Linux AMI를 선택하고는 화면설명 내용대로 user 로그인 id를 ubuntu로 했었네요. 괜히 페어키가 잘 못된 건가 한참을 헤매고 돌다가 왔습니다. ㅡㅡ; 혹시나 저 처럼 안되시는 분들이 계실까봐 참고하시라고 올립니다. Ubuntu AMI : ubuntuAmazon Linux2 : ec2-userAmazon Linux AMI : ec2-userDebian AMI : admin or rootFedora AMI : ec2-user or fedora 라고 하네요..
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
two form on a page 관련 질문
안녕하세요!한 페이지당 2개의 form을 사용해서 페이지를 만들려고 합니다.2개의 form을 만든 사례가 구글링을 해도 많이 보이지 않아서 직접 View class를 상속받아서만 만들어봤습니다.그래서 view를 다음과 같이 만들었지만 에러가 발생되어 구글링을 하거나 print문으로 찍어봐도 어디서 해결할지를 몰라서 여쭤봅니다.Traceback (most recent call last): File "/Users/jehakim/.pyenv/versions/assignment/lib/python3.10/site-packages/django/core/handlers/exception.py", line 55, in inner response = get_response(request) File "/Users/jehakim/.pyenv/versions/assignment/lib/python3.10/site-packages/django/utils/deprecation.py", line 136, in call response = self.process_response(request, response) File "/Users/jehakim/.pyenv/versions/assignment/lib/python3.10/site-packages/django/middleware/clickjacking.py", line 34, in process_response response.headers["X-Frame-Options"] = self.get_xframe_options_value(AttributeError: 'dict' object has no attribute 'headers'위 에러는 django middleware 단에서 발생했습니다. views.py한 화면에 버튼이 2개가 있고, 이 버튼에 따라 전송되는 form이 다른 상황입니다. 이런 상황일 때 버튼을 구분하는 방법을 구글링해보니 button tag에 name 속성으로 구분하면 된다고 하여"refusal-btn" 과 "approval-btn" 으로 구분했습니다.FBV로 먼저 만든 후 코드가 너무 지저분해 보여서 CBV로 바꿨습니다.views.py from django.shortcuts import render, redirect, get_object_or_404 from django.contrib.auth.decorators import login_required from django.utils.decorators import method_decorator from django.views.generic import FormView, ListView, View from django.views.generic.base import ContextMixin from django.contrib.auth import login, logout from django.urls import reverse_lazy from django.utils import timezone from django.db.models import Q from config.settings.base import COUNTS_PER_PAGE from accounts.utils import ( authorization_filter_on_employee_list, authorization_filter_on_signup_list, ) from accounts.forms import ( ResignationForm, EmployeeForm, SignUpForm, LoginForm, UserForm, ) from accounts.models import User, Employee @method_decorator(login_required(login_url=reverse_lazy("login")), name="get") class SignupUserDetailView(View, ContextMixin): user_object = None user_form = None employee_form = None context = dict() def post(self, request, **kwargs): self.user_form = UserForm(request.POST, instance=self.user_object) if self.user_form.is_valid(): state = self.user_form.cleaned_data.get("state") self.user_object.state = state if "refusal-btn" in request.POST: reason_for_refusal = self.user_form.cleaned_data.get( "reason_for_refusal" ) rejected_at = timezone.now() self.user_object.reason_for_refusal = reason_for_refusal self.user_object.rejected_at = rejected_at self.user_object.save() else: # approval-btn 일 때 self.employee_form = EmployeeForm(request.POST) if self.employee_form.is_valid(): cleaned_data = self.employee_form.cleaned_data grade = self.employee_form.data.get("grade") authorizations = { "authorization_grade": grade, "signup_approval_authorization": cleaned_data.get( "signup_approval_authorization" ), "list_read_authorization": cleaned_data.get( "list_read_authorization" ), "update_authorization": cleaned_data.get( "update_authorization" ), "resign_authorization": cleaned_data.get( "resign_authorization" ), } employee = Employee.objects.create( user_id=self.user_object.id, **authorizations ) employee.save() self.user_object.save() return render(request, "detail.html", self.get_context_data()) return render(request, "detail.html", self.get_context_data()) def get(self, request, user_id): self.user_object = get_object_or_404(User, pk=user_id) self.user_form = UserForm(instance=self.user_object) self.employee_form = EmployeeForm() return render(request, "detail.html", self.get_context_data()) def get_context_data(self, **kwargs): self.context["user_form"] = self.user_form self.context["employee_form"] = self.employee_form self.context["signup_list"] = True return self.context제일 하단에 있는 signup_list 는 하나의 템플릿 .html을 사용하는데 두 개의 view에서 이를 공유하기 때문에 이를 구분하고자 만든 flag 변수입니다.제가 알기로는 render 함수는 HttpResponse를 반환하는데 그러면 header가 당연히 있지 않나? 라는 생각이라서 부딪혔습니다.제 생각에는 기존에 다른 View 종류들을 상속받으면 해결해주는 거를 순수히 View만 상속받아서 어느 부분을 놓친 것 같은데, 이러면 어느 클래스를 상속받으면 될지, 아니면 직접 뭔가를 해야할지 모르겠습니다.읽어주셔서 감사합니다.advice 해주시면 감사하겠습니다 ㅠㅠ
-
미해결ChatGPT 영어 상황극 채팅 서비스 만들기 (Feat. 파이썬/장고채널스)
환경변수 로딩이 안됩니다 ㅠㅠ
안녕하세요 장고 환경변수 로딩하는 부분, 몇번 돌려보면서 확인했는데 계속 에러가 나오네요. 혹시 어떤게 잘못되었을지 알 수 있을까요.. 도와주세요..(venv) C:\Users\user\Documents\django_chat>python manage.py shellPython 3.10.9 | packaged by Anaconda, Inc. | (main, Mar 1 2023, 18:18:15) [MSC v.1916 64 bit (AMD64)] on win32Type "help", "copyright", "credits" or "license" for more information.(InteractiveConsole)>>> from django.conf import settings>>> settings.OPENAI_API_KEYTraceback (most recent call last): File "C:\Users\user\Documents\django_chat\venv\lib\site-packages\environ\environ.py", line 387, in get_value value = self.ENVIRON[var_name] File "C:\Users\user\anaconda3\lib\os.py", line 680, in getitem raise KeyError(key) from NoneKeyError: 'OPENAI_API_KEY'The above exception was the direct cause of the following exception:Traceback (most recent call last): File "<console>", line 1, in <module> File "C:\Users\user\Documents\django_chat\venv\lib\site-packages\django\conf\__init__.py", line 102, in getattr self._setup(name) File "C:\Users\user\Documents\django_chat\venv\lib\site-packages\django\conf\__init__.py", line 89, in _setup self._wrapped = Settings(settings_module) File "C:\Users\user\Documents\django_chat\venv\lib\site-packages\django\conf\__init__.py", line 217, in init mod = importlib.import_module(self.SETTINGS_MODULE) File "C:\Users\user\anaconda3\lib\importlib\__init__.py", line 126, in import_module return bootstrap.gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1050, in gcdimport File "<frozen importlib._bootstrap>", line 1027, in findand_load File "<frozen importlib._bootstrap>", line 1006, in findand_load_unlocked File "<frozen importlib._bootstrap>", line 688, in loadunlocked File "<frozen importlib._bootstrap_external>", line 883, in exec_module File "<frozen importlib._bootstrap>", line 241, in callwith_frames_removed File "C:\Users\user\Documents\django_chat\mysite\settings.py", line 134, in <module> OPENAI_API_KEY=env.str("OPENAI_API_KEY") File "C:\Users\user\Documents\django_chat\venv\lib\site-packages\environ\environ.py", line 212, in str value = self.get_value(var, cast=str, default=default) File "C:\Users\user\Documents\django_chat\venv\lib\site-packages\environ\environ.py", line 391, in get_value raise ImproperlyConfigured(error_msg) from excdjango.core.exceptions.ImproperlyConfigured: Set the OPENAI_API_KEY environment variable>>>
-
미해결파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편
동기방식의 consumer 클래스와 비동기방식의 consumer클래스의 차이가 뭔지 궁금합니다.
1. 동기방식의 consumer 클래스와 비동기방식의 consumer클래스의 차이가 뭔지 궁금합니다.jsonwebsocketconsumer에서 모델을 임포트하여 db를 수정해도 문제가 없을까요?? 웹소켓에 연결할때 마가 하나의 연결당 하나의 consumer가 생성되는건가요??
-
미해결파이썬으로 장고(Django) 공략하기: 입문
[리뷰 삭제하기] 삭제시 path 에러문구나옴.
리뷰삭제하기 진행중입니다.그대로 따라하고 있는데요. 희안하게 리뷰삭제버튼을 클릭하면 path 에러가 나네요. 오타는 여러번 확인 했습니다. [상세화면] [삭제버튼 후 오류메시지][urls.py][detail.html][ views.py]
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
url 할당 질문
안녕하세요 강사님 강의 잘 보고있습니다.강사님의 강의를 보고 따로 프로젝트를 만들어 보고 있는데 로컬주소/dashboard를 하면 dashboard가 안열러서 뭐가 잘못됐는지 궁금해서 질문드립니다!일단 프로젝트 구조입니다. urls.py 입니다 dashboard/urls/dashboard.py 입니다 dashboard/views/dashboard.py 입니다. 실행을 하면 url이 없다고 합니다
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
token을 Cookie에 저장하는 것에 관한 에러 질문
안녕하세요! 강사님의 강의를 듣고 질문 타이틀에 적힌 대로 시도하는 과정에 어려움이 생겨 질문 드립니다.제가 시도한 인증/인가 흐름은 다음과 같이 진행됩니다.클라이언트가 로그인 요청 (성공)서버에서는 이에 대해 access token과 refresh token을 생성하고, access token은 response body에, refresh token은 cookie에 담아 응답을 보냅니다. (성공)클라이언트의 요청에 대해 응답이 성공적으로 들어오면 / 화면으로 redirect되고, response body에 담긴 access token은 변수에 저장되고 (성공), refresh token은 brower cookie에 저장됩니다. (실패)2번까지는 성공했지만 3번에서 cookie에 저장하는 것에 실패했습니다. 코드는 다음과 같습니다.클라이언트단 코드 const onFinish = (values) => { setFieldErrors({}); async function fn() { try { const { data: token } = await Axios.post("http://localhost:8000/accounts/auth", values, { credentials: "include" } ); axios.defaults.headers.common["Authorization"] = `Bearer ${token.access}` navigation("/"); ... 서버단 코드 (accounts/auth)아래 코드를 작성하는데 참고한 django 공식문서는 [여기](https://docs.djangoproject.com/en/3.0/ref/request-response/#django.http.HttpResponse.set_cookie) 입니다.Access-Control-Allow-Credentials의 경우, django-cors-header가 있어도 발생하여 해당 헤더를 추가하니 해결되었습니다. 또한 클라이언트단에도 credentials를 추가했습니다.from rest_framework_simplejwt.views import TokenObtainPairView class AuthView(TokenObtainPairView): def post(self, request, *args, **kwargs)): ... response = Response( {"access": serializer.validated_data.get("access", None)}, status=status.HTTP_200_OK, ) refresh_token = serializer.validated_data.get("refresh", None) response.set_cookie( "refresh", refresh_token, httponly=True, samesite=None, max_age=24 * 60 * 60, secure=False, domain="localhost", ) response.headers["Access-Control-Allow-Credentials"] = True return response 위 코드의 응답 결과는 다음 이미지와 같습니다.response headers에 담긴 전체 정보이고, Set-Cookie에 관한 내용은 다음과 같이 나왔습니다.Set-Cookie:refresh=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTY4ODcxMzE5OSwiaWF0IjoxNjg4NjI2Nzk5LCJqdGkiOiIwZTNkNGYwN2RiZTI0NGUyYWMyMmVlODIzYjAzMzZkMCIsInVzZXJfaWQiOjd9.xAsVsvuoUcukBZ0t2iVo-yIlplDy2JlwE_R4cX1YwmU; Domain=localhost; expires=Fri, 07 Jul 2023 06:59:59 GMT; HttpOnly; Max-Age=86400; Path=/ 그래서 시도한 것들은 다음과 같습니다.httponly, samesite, secure 각 값들에 대해서 하나씩 값을 바꿔가면서 시도했습니다.domain keyword 인자를 없애기도 했습니다. chrome의 캐쉬 설정이 문제인가 하여 third-party cache 허용으로도 바꿨습니다.middleware가 문제인가 하여 django-cors-header와 debug toolbar를 꺼서 시도해봤습니다.application/Cookies 뭔가 남아있으면 삭제하고 다시 로그인으르 시도했습니다.하지만 위 시도들을 했음에도 불구하고도 해결이 되지 않아 강사님에게 여쭤봅니다 ㅠㅠ