묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[개정판] 파이썬 머신러닝 완벽 가이드
Permutation Importance 직관적으로 확인하는 방법
안녕하세요 강사님!최근에 알게되었는데Permutation importance를 eli5 패키지에서직관적으로 볼 수 있는 기능이 있습니다. 먼저 모델을 만든 다음에(아래 그림에는 XGboost)test_x, test_y 칼럼을 넣고, scoring 파라미터를 넣으면Importance 결과를 그림으로 아주 쉽게 보여줍니다!날이 갈수록 신기한 기능이 많이 나오는 것 같습니다.감사합니다
-
미해결딥러닝 CNN 완벽 가이드 - TFKeras 버전
모델 구현 질문
안녕하세요 강사님! 강의 매우 잘듣고 있는 학생입니다. 제가 텐서플로우에 다른 스타일로 모델을 구현하는 법이 있길래 본 강의에서 초반에 regression하는 부분을 작성해보앗습니다. 이렇게 작성하였는데 예측을 해보면 예측 값 정확도가 매우 떨어집니다. 제가 보기에는 두 모델 코드를 작성한 스타일만 다르고 모두 같다고 생각되는데 왜 예측값이 많이 다른지 모르겠습니다.. 혹시 이부분이 왜 그런지 알 수 있을까요..??
-
미해결비전공자를 위한 개발자 취업 올인원 가이드 [취업편]
개발 경력 3개월..
개발 경력이 3개월인 경우도 이력서에 적는게 좋을까요?
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
섹션 1이 없습니다.
다운로드 폴더에 섹션2부터 있습니다. 확인 부탁드립니다.
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
파이썬 채점 질문 드려요
똑같이 진행했는데 채점 결과 exit_code_1 로 해서 점수 0이 나왔습니다. 해결 방법이 어캐 되나요?
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
누르는 시점에 이미 isDouble이 true가 되어서 종료되어야하는거 아닌가요?
override fun onBackPressed() { Log.d("MainActivity", "backbutton") if(isDouble == true) { finish() } isDouble = true 취소버튼을 눌렀을 때, isDouble이 true면 종료된다고 써있는데 바로 밑에 isDouble이 true라고 써놓으면 누르는 순간 true가 되어서 바로 꺼져야하는 것이 아닌가요? == true와 =true가 다른건가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
연관관계에 대한 정의
강사님 안녕하십니까 강의 너무 재밌게 잘 듣고 있습니다! 다름이 아니라 이번 강의에서 다룬 Team에 존재하는 Member 객체 리스트는 왜 조회되지 않을까?에 대한 부분이 헷갈려서 해당 강의 부분에 있는 QnA를 보면서 코드도 작성해보면서 공부했는데, 제가 생각한 것이 맞는지 궁금하여 질문드립니다. 1) 1번만 주석처리 안할 경우 Team에 있는 Member형 리스트에서 member가 조회됨. 쿼리는 commit 때 나감 왜? 여기서 select쿼리가 나가지 않는 이유는 캐시에 존재하기 때문 2) 2번만 주석처리 안할 경우 insert 쿼리 나가고, DB에 select 쿼리 보내어 조회 왜? clear해서 영속성 컨텍스트는 비워져있어, db에서 가져오면서 캐시에 저장함 3) 1, 2번 둘 다 주석처리할 경우 findTeam.getMembers() 하면 Member형 리스트는 불러올 수 있다. 왜? Team 안에서 리스트를 이미 초기화해주었기 때문이다. 그러나 이 안에 아무것도 들어있지 않아 member를 조회할 수 없음 4) 여기서 2번이 중요 어떻게 Team의 members에 객체를 add하지 않았는데 조회가 될까? 영속성 컨텍스트에 team이 없음(clear 때문) 그래서 JPA가 DB에서 까지 다녀와 Team 객체를 만든다. 이 때, 연관관계 매핑이 되어있기 때문에 team.getMembers(), member.getTeam()의 값을 채워준다. https://www.inflearn.com/questions/27517 위 qna에 관해 강사님께서 새로운 영속성 컨텍스트는 member가 없기 때문에 DB에서 새로 member를 조회하고, JPA가 member 객체를 생성합니다. 그리고! JPA가 member 객체를 생성할 때, 연관관계 매핑이 되어 있기 때문에 member.getTeam()은 물론이고, team.getMembers() 모두 값을 채워줍니다.(물론 지연 로딩을 사용할 수도 있습니다.) 방금 말씀드린 부분을 코드로 짜서 하나씩 실행을 해보면 이해가 되실꺼에요^^! 이렇게 말씀을 해주셨습니다. 5) JPA가 채워준다는 의미는 그냥 아.. db에서 가져오면 연관관계가 된 프로퍼티를 채워준다? 라고 생각하면 되나요? Member에서는 Team 프로퍼티를 채우고, Team에서는 Member 프로퍼티를 채운다. 요런 느낌으로요! 6) 5번과 관련해서 for문에서 members를 조회하는데 왜 select 쿼리를 보내는지 궁금합니다. db에서 가져오면 채워준다고 말씀을 하셨는데 다른 걸 채워주는건가요?? try { Team team = new Team(); team.setName("TeamA"); em.persist(team); Member member = new Member(); member.setUsername("member1"); em.persist(member); // team.getMembers().add(member); //1번 em.flush(); //2번 em.clear(); System.out.println("===================="); Team findTeam = em.find(Team.class, team.getId()); List<Member> members = findTeam.getMembers(); System.out.println("===================="); Member member2 = em.find(Member.class, member.getId()); System.out.println("===================="); System.out.println("member2 = " + member2.getId()); System.out.println("======================"); for (Member member1 : members) { /////1번 질문 System.out.println("member1 = " + member1.getUsername()); } System.out.println("======================"); tx.commit(); 긴 글 죄송합니다.. 처음에는 이해가 됐는데 코드를 작성할수록 이해가 되질 않아서 질문드립니다. 감사합니다!
-
미해결작정하고 장고! Django로 Pinterest 따라만들기 : 바닥부터 배포까지
vultr에서 stack으로 서비스 배포후 이미지 수정
vultr에서 포테이너 도커스웜으로 stack배포를 해서 여러가지 프로젝트를 진행중입니다! 좋은 강의 만들어주셔서 감사합니다ㅎㅎ 그런데 한가지 궁금한것이 있습니다. stack배포후에 도커스웜으로 배포되는 docekr image를 수정하려면 db를 날리지 않고 진행하는 방법은 없는걸까요...??? docker swarm, stack, docker image변경 세가지 키워드로 구글링 하고있는데 방법이 잘 검색이 안되네요...ㅠㅠㅠ 알려주시는게 좀 까다롭다면 관려된 링크나 검색해볼 키워드라고 알려주시면 정말 감사하겠습니다....ㅠㅠㅠ
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
설명을 자세히 안해주시는건 당장 중요하지 않아서인가요?
새로 배우는 내용이 엄청 많은데 자세한 설명이 없이 그냥 도표 하나만 보여주고 이건 이렇다 정도로만 넘어가시네요. 지금 당장 다 알 필요는 없어서 그런건지 아니면 이걸 이해못하면 다음 영상으로 넘어가지 안되는건지 알고싶어요
-
미해결반응형 웹사이트 포트폴리오(Architecture Agency)
href 링크
선생님 강의를 잘 들었습니다. 다름이 아니라 다 만들었는데 저같은 경우 home section에 네비 메뉴를 넣어뒀습니다. 그래서 각 section에 클래스 옆에다가 아이디로 해당 네비게이션 이름을 지정해놨습니다, 그래서 네비게이션버튼을 눌렀을 때 넘어갈 줄 알았는데 넘어가지를 않아서 아무리 고민을 해봐도 답이 안나와서 글을 남기게 되었습니다. 밑에 코드랑 화면 같이 남기도록 하겠습니다. 감사합니다. <body data-hijacking="on" data-animation="scaleDown"> <section class="cd-section visible" id="home"> <div> <div class="content"> <video src="video/Tomorrowland Presents _ THIS WAS TOMORROW Official Movie Trailer (1080p)_1.mp4" autoplay muted loop></video> </div> </div> </section> <section class="cd-section" id="about"> </section> 각 섹션별로 아이디를 동일하게 지정해놓은 상태입니다. header영역 <header> <div class="head_inner"> <h1 class="logo"><a href="#"><img src="images/android-icon-48x48.png" alt="logo"></a></h1> <div class="gnb"> <ul> <li><a href="#home">Home</a></li> <li><a href="#about">About</a></li> <li><a href="#lineup">LineUp</a></li> <li><a href="#md">MD</a></li> <li><a href="#directions">Directions</a></li> <li><a href="#contact">Contact</a></li> </ul> </div> <div class="slogan">Make Some Noise</div> </header>
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
mssql이 아닌 몽고db를 사용하는 이유가 무엇일까요?
저는 스마트 펙토리 업무를 했었고, c# 윈폼이랑 mssql를 사용했었습니다. 웹 개발을 처음인데요. mssql이 아닌 몽고db를 사용하는 이유가 무엇일까요? - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결파이썬으로 장고(Django) 공략하기: 입문
NameError: name 'os' is not defined
STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static") ] 추가하셨는데 에러나신다면 ? NameError: name 'os' is not defined 에러 뜨시는분들은 settings.py 에 import os 추가! 강의 영상 중간에 끊고 작성 중인데 뒤에 짚어주실지는 모르겠으나 글 남깁니다. 에러떴는데 그냥 못넘어가서요ㅠ
-
미해결따라하며 배우는 도커와 CI환경 [2023.11 업데이트]
베이스 이미지에 대한 질문입니다.
node와 같은 프로그램(ex> nginx/tomcat)을 꼭 특정 OS (ex> Centos/ubuntu)버전에서 쓰고싶다고하면 도커파일을 어떻게 작성해야하는건가요? Centos 이미지 + node 이미지 각각 만들어서 연동시켜야하는건가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
멀티스레드 환경 변경감지 동시성 관련 질문
안녕하세요 ! JPA 관련 강의를 전부 듣고 개인적으로 공부를 하던 과정에서 궁금한점이 하나생겨 문의드립니다 ! Book이라는 엔티티가 존재하고 수량이라는 컬럼이 존재한다고 가정하고 고객들이 주문을 하게되면 수량이 계속해서 감소하는 로직을 구현했을경우 고객이 동시에 Book을 주문하려고 하는 상황에서 고객1 : 주문전 Book 엔티티 조회(영속성상태)시 수량 20개 고객2 : 주문전 Book 엔티티 조회(영속성상태)시 수량 20개 고객1이 Book 10개를 주문하여 수량이 10개 감소한상태로 변경감지로 업데이트문이 나갈텐데 고객2에 주문전 Book 엔티티는 10개가 감소한 10개인상태에서 차감이 이루어져야할것같은데 WEB환경에서는 서로다른 트랜잭션에서 DB를 처리하게되므로 고객2에 주문전 Book 엔티티는 여전히 20개인상태에서 주문한 수량만큼 차감되어 업데이트가 실행되 두개 주문사이에 수량이 맞지않는 현상이 발생할것같은데 멀티스레드환경에서 각 엔티티가 동시성을 지원하는지 혹은 이러한방법으로 개발하는걸 지양해야하는지 궁금합니다 !!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Whilelabel error page 가 뜨네요
이전까지는 회원추가 목록 조회가 잘 됐는데, 디비 연결 이후부터 whitelabel error page가 뜨네요. 처음 화면은 잘 뜨지만, 회원조회에 들어가면 에러 페이지가 뜹니다. 그대로 따라한 것 같은데 정확한 이유를 몰라 드라이브에 코드와 함께 남깁니다! https://drive.google.com/drive/folders/1zgtAWYEhacuXg-N3KcMy5sPy4HSbR18F?usp=sharing
-
미해결스프링 핵심 원리 - 기본편
스프링 빈의 라이프사이클 내에서
안녕하세요, 다른 분들의 질문을 참고해봐도 혼자서 이해하는게 너무 버거워서 질문을 남깁니다. 여기저기 출력문을 찍어보니 ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class); 에서 "스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존 관계 주입 -> 초기화 콜백" 까지 한번에 된다는 사실을 알았습니다. public class BeanLifeCycleTest { @Test public void lifeCycleTest() { System.out.println("rmfjadjswptodtjdeh;a??1"); ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class); System.out.println("rmfjadjswptodtjdeh;a??2"); NetworkClient client = ac.getBean(NetworkClient.class); ac.close(); } @Configuration static class LifeCycleConfig { @Bean public NetworkClient networkClient() { NetworkClient networkClient = new NetworkClient(); //networkClient.setUrl("http://hello-spring.dev"); System.out.println("stestesatestasetasetaset"); return networkClient; } } } 1. setUrl은 생성자 주입처럼 동시에 의존관계가 주입되는게 맞을까요?? 2. 여기서 setUrl은 다른 분들의 질문을 보니 값 주입이라고 하던데 의존관계 주입이나 값 주입이나 비슷하다고 이해하고 넘어가면 될까요?? 3. afterPropertiesSet() 은 따로 호출을 하지 않았는데, 어떻게 호출을 하는건가요?? 4. 초기화 콜백은 '무조건' 호출이 되는 걸까요? 실제로 setUrl을 주석 처리해도 콜백함수가 호출이 됩니다. 질문이 조금 많지만 답변 부탁드립니다 ㅠㅠ 감사합니다.
-
미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
태그 작성 오류
test진행시 마지막 단계에서 이런 오류 문구가 떠서 강사님과 똑같이 오류수정 진행하는데 해결이 되질 않습니다 ㅠ 혹시 몰라 views.py 와 test.py를 첨부해드리겠습니다. from django.core.exceptions import PermissionDenied from django.shortcuts import render, redirect from django.utils.text import slugify from django.views.generic import ListView, DetailView, CreateView, UpdateView from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from blog.models import Post, Category, Tag 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 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): # LoginRequiredMixin 로그인이 되어 있는 경우에만 이 페이지 접속 가능하게 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 # 만들어진 Form에 instance의 author라는 필드를 current_user 로 채워라 response = super(PostCreate, self).form_valid(form) # from_valid() : 양식이 유효한경우 관련 모델을 저장. tags_str = self.request.POST.get('tags_str') if tags_str: tags_str = tags_str.strip() # strip : 문자열 앞뒤에 빈공간 있으면 없애준다. tags_str = tags_str.replace(',', ';') # 문자열 바꿔주기 , > ; tags_list = tags_str.split(';') # for t in tags_list: t = t.strip() tag, is_tag_created = Tag.objects.get_or_create(name=t) # get_or_create(name=t) : 만약, name 이 t인 것을 가져오고, 없으면 그것을 name이 t로 만들어서 가져오기. if is_tag_created: tag.slug = slugify(t, allow_unicode=True) tag.save() self.object.tags.add(tag) return response else: return redirect('/blog/') # 로그인을 하지 않고 해당 페이지를 열려하면 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): # 디스패치라는것은 url을 get 방식인지 post방식인지 알아내는 방법이지만, 해당 하는 포스트에 권한이 있는 유저인지 검증할 수 있다. if request.user.is_authenticated and request.user == self.get_object().author: return super(PostUpdate, self).dispatch(request, *args, **kwargs) else: raise PermissionDenied # 장고에서 기본으로 제공되는 기능이고, 에러 페이지 대신에 권한이 없다면 권한이 없다는 메시지를 띄어준다 def get_context_data(self, **kwargs): context = super(PostUpdate, self).get_context_data() if self.object.tags.exists(): tags_str_list = list() for t in self.object.tags.all(): tags_str_list.append(t.name) context['tags_str_default'] = '; '.join(tags_str_list) return context def form_valid(self, form): response = super(PostUpdate, self).form_valid(form) self.object.tags.clear() tags_str = self.request.POST.get('tags_str') if tags_str: tags_str = tags_str.strip() # strip : 문자열 앞뒤에 빈공간 있으면 없애준다. tags_str = tags_str.replace(',', ';') # 문자열 바꿔주기 , > ; tags_list = tags_str.split(';') # for t in tags_list: t = t.strip() tag, is_tag_created = Tag.objects.get_or_create(name=t) # get_or_create(name=t) : 만약, name 이 t인 것을 가져오고, 없으면 그것을 name이 t로 만들어서 가져오기. if is_tag_created: tag.slug = slugify(t, allow_unicode=True) tag.save() self.object.tags.add(tag) return response 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 } ) # def single_post_page(request, pk): # reqeust, 변수명 # post = Post.objects.get(pk=pk) # # return render( # request, # 'blog/single_page.html', # { # 'post': post, # } # ) ## 이건 test.py 코드입니다################## from django.test import TestCase, Client # Client 가 하는 역할 : 장고에서 재공하는 것이며 웹사이트의 방문자를 말함? from bs4 import BeautifulSoup from .models import Post, Category, Tag from django.contrib.auth.models import User # 장고에서 기본적으로 제공하는 User 임. class TestView(TestCase): def setUp(self): # DB에 들어갈 내용을 여기서 테스트 적용 self.client = Client() self.user_trump = User.objects.create_user( username='trump', password='somepassword', ) self.user_obama = User.objects.create_user( username='obama', password='somepassword', ) self.user_obama.is_staff = True self.user_obama.save() self.category_programming = Category.objects.create( name='programming', slug='programming' ) self.category_music = Category.objects.create( name='music', slug='music' ) self.tag_python_kor = Tag.objects.create( name='파이썬 공부', slug='파이썬-공부' ) self.tag_python = Tag.objects.create( name='python', slug='python' ) self.tag_hello = Tag.objects.create( name='hello', slug='hello' ) self.post_001 = Post.objects.create( title='첫번째 포스트 입니다.', content='Hello, World. we are the World', category=self.category_programming, author=self.user_trump ) self.post_001.tags.add(self.tag_hello) self.post_002 = Post.objects.create( title='두번째 포스트 입니다.', content='저는 쌀국수를 좋아합니다.', category=self.category_music, author=self.user_obama ) self.post_003 = Post.objects.create( title='세번째 포스트 입니다.', content='Category가 없나유.', author=self.user_obama ) self.post_003.tags.add(self.tag_python) self.post_003.tags.add(self.tag_python_kor) def navbar_test(self, soup): navbar = soup.nav self.assertIn('Blog', navbar.text) self.assertIn('About Me', navbar.text) logo_btn = navbar.find('a', text='Saohwan') 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) # 카테고리스라는 문구가 categories_card 에 있는지 확인하는 테스트 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) # 시작하자마자 포스트가 3개있다. # 1.1 포스트 목록 페이지 (post list)를 연다. response = self.client.get('/blog/') # 블로그 페이지가서 읽고 # 1.2 정상적으로 페이지가 로드된다. self.assertEqual(response.status_code, 200) # 에러 코드가 200이면 정상임 # 1.3 페이지의 타이틀에 Blog 라는 문구가 있다. soup = BeautifulSoup(response.content, 'html.parser') self.assertIn('Blog', soup.title.text) # soup.title.text에 'blog' 라는 문구가 있어야한다. soup 으로 접근 self.navbar_test(soup) # 블로그라는게 헤더 타이틀에 있는지 확인\ self.category_card_test(soup) # 3.3 메인 영역에 포스트 2개의 타이틀이 존재한다. main_area = soup.find('div', id='main-area') # 3.4 "아직 게시물이 없습니다" 라는 문구가 없어야 한다. self.assertNotIn('아직 게시물이 없습니다.', main_area.text) 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_hello.name, post_001_card.text) self.assertNotIn(self.tag_python.name, post_001_card.text) self.assertNotIn(self.tag_python_kor.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_hello.name, post_002_card.text) self.assertNotIn(self.tag_python.name, post_002_card.text) self.assertNotIn(self.tag_python_kor.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.assertNotIn(self.tag_hello.name, post_003_card.text) self.assertIn(self.tag_python.name, post_003_card.text) self.assertIn(self.tag_python_kor.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) # upper 대문자로 나왔으면 좋겠을 때. def test_post_list_without_posts(self): Post.objects.all().delete() response = self.client.get('/blog/') self.assertEqual(response.status_code, 200) # 에러 코드가 200이면 정상임 soup = BeautifulSoup(response.content, 'html.parser') self.navbar_test(soup) self.assertIn('Blog', soup.title.text) self.assertEqual(Post.objects.count(), 0) # Post 모델에 레코드가 몇개 있는지 아무 겄도 없을때 main_area = soup.find('div', id='main-area') self.assertIn('아직 게시물이 없습니다.', main_area.text) def test_post_detail(self): self.assertEquals(Post.objects.count(), 3) # 테스트는 생성할때마다 DB가 초기화되서 0이다. # 1.2 그 포스트의 url은 '/blog/1/' 이다. self.assertEquals(self.post_001.get_absolute_url(), '/blog/1/') # 2 첫 번째 포스트의 상세 페이지 테스트 # 2.1 첫 번쨰 포스트의 url로 접근하면 정상적으로 response가 온다..(status code: 200). response = self.client.get(self.post_001.get_absolute_url()) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') # 2.2 포스트 목록 페이지와 똑같은 내비게이션 바가 있다. self.navbar_test(soup) self.category_card_test(soup) # 2.3 첫 번째 포스트의 제목이 웹 브라우저 탭 타이틀에 들어 있다. self.assertIn(self.post_001.title, soup.title.text) # 2.4 첫 번째 포스트의 제목이 포스트 영역에 있다. 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) # 2.5 첫 번째 포스트의 작성자(author)가 포스트 영역에 있다.(아직 구현할 수 없음). self.assertIn(self.user_trump.username.upper(), main_area.text) # 2.6 첫 번째 포스트의 내용(content)이 포스트 영역에 있다. self.assertIn(self.post_001.content, 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') # 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_hello.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_hello.name, soup.h1.text) main_area = soup.find('div', id='main-area') self.assertIn(self.tag_hello.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_create_post_without_login(self): response = self.client.get('/blog/create_post/') self.assertNotEqual(response.status_code, 200) def test_create_post_with_login(self): self.client.login(username='trump', password='somepassword') response = self.client.get('/blog/create_post/') self.assertNotEqual(response.status_code, 200) self.client.login(username='obama', password='somepassword') 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) tags_str_input = main_area.find('input', id='id_tags_str') # input 이라는 태그중에서 id가 id_tags_str 이 있는지 확인하는 작업. self.assertTrue(tags_str_input) self.assertEqual(Tag.objects.count(), 3) self.client.post( '/blog/create_post/', { 'title': 'Post Form 만들기', 'content': 'Post Form 페이지를 만듭시다.', 'tags_str': 'new_tag; 한글 태그, python' } ) last_post = Post.objects.last() self.assertEqual(last_post.title, 'Post Form 만들기') self.assertEqual(last_post.author.username, 'obama') self.assertEqual(last_post.content, 'Post Form 페이지를 만듭시다.') self.assertEqual(last_post.tags.count(), 3) self.assertTrue(Tag.objects.get(name='new_tag')) self.assertTrue(Tag.objects.get(name='한글 태그')) self.assertTrue(Tag.objects.get(name='python')) self.assertEqual(Tag.objects.count(), 5) def test_update_post(self): update_post_url = f'/blog/update_post/{self.post_003.pk}/' # 로그인 하지 않은 상태에서 접근 하는 경우 response = self.client.get(update_post_url) self.assertNotEqual(response.status_code, 200) # 로그인은 했지만, 작성자가 아닌 경우 self.assertNotEqual(self.post_003.author, self.user_trump) self.client.login(usernmae='trump', password='somepassword') response = self.client.get(update_post_url) self.assertNotEqual(response.status_code, 200) # 작성자(obama)가 접근하는 경우 self.assertEqual(self.post_003.author, self.user_obama) self.client.login(username='obama', password='somepassword') response = self.client.get(update_post_url) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') self.assertEqual('Edit Post - Blog', soup.title.text) main_area = soup.find('div', id='main-area') self.assertIn('Edit Post', main_area.text) tag_str_input = main_area.find('input', id='id_tags_str') self.assertTrue(tag_str_input) self.assertIn('파이썬 공부; python', tag_str_input.attrs['value']) response = self.client.post( update_post_url, { 'title': '세 번째 포스트를 수정했습니다.', 'content': '안녕 세계? 우리는 하나!', 'category': self.category_music.pk, 'tags_str': '파이썬 공부; 한글 태그, some tag' }, follow=True # 위 내용을 리다이렉트 되는 것을 따라가려면 설정 ) soup = BeautifulSoup(response.content, 'html.parser') main_area = soup.find('div', id='main-area') self.assertIn('세 번째 포스트를 수정했습니다.', main_area.text) self.assertIn('안녕 세계? 우리는 하나!', main_area.text) self.assertIn(self.category_music.name, main_area.text) self.assertIn('파이썬 공부', main_area.text) self.assertIn('한글 태그', main_area.text) self.assertIn('some tag', main_area.text) self.assertNotIn('python', main_area.text)
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
editForm.html 파일이 이상합니다.
editForm.html 파일만 코드가 파란색으로 되면서 html 문법이 적용 안되는거같더라구요.. 재밌는건 editForm.html 이라는 이름의 파일만 그렇고 다른 이름이면 괜찮네요.. 또 editFoom.html 이라고 생성해서 코드를 넣고 이름을 editForm.html로 바꾸면 또 코드가 저렇게 바뀝니다. 뭐가 문제일까요..? 실제로 돌려보면 작동하긴 합니다만...ㅠ
-
미해결[리뉴얼] 코딩자율학습 제로초의 자바스크립트 입문
person.getAge() 값이 왜 수정이 안되는지 모르겠습니다;;
클로저 공부를 하다가 인터넷에서 이런 예시가 있어서 RunJS에서 따라쳐봤는데요. person.age를 30으로 바꿨고, person.age를 출력했을 때는 30이 찍히는데, 왜 person.getAge( ); 로 찍었을 때는 15로 계속 나오는지 도저히 이해가 안되네요ㅠ 왜 이런 현상이 발생하는 건가요??? ;;;;;;;
-
미해결코딩인터뷰를 저격하는 JS 스나이퍼 양성학교
클로저 파트 마지막 예시에 관해 질문있습니다.
예시를 RunJS에서 따라쳐봤는데요. person.age를 30으로 바꿨고, person.age를 출력했을 때는 30이 찍히는데, 왜 person.getAge( ); 로 찍었을 때는 15로 계속 나오는지 도저히 이해가 안되네요ㅠ 왜 이런 현상이 발생하는 건가요??? 제가 이해력이 부족해서, 강의만으로 온전히 이해가 안되네요. 이 부분에 대해서 좀 더 자세한 설명 부탁드리겠습니다. 감사합니다.- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.