inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

172만명의 커뮤니티!! 함께 토론해봐요.

검증용 데이터 분리시

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

y = (y_train['income'] == '>50K').astype(int) 이렇게 하면 50k 보다 큰 값에서는 1이 나오는데, 만약 3개의 값으로 나오게 하려면 어떻게 해야하나요? (0, 1, 2) 등등 그리고 윗 코딩대로 진행하면 <=50k 는 자동적으로 0이 되는건가요? 이유가 있을까요?

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
김치현 댓글 2 좋아요 0 조회수 101

7회 기출유형(작업형3)

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

7회 기출유형(작업형3)에서 상관계수 구하는 문제, ERP와 각 변수 사이의 상관계수 계산이면 ERP 자기자신(상관계수 1)은 빼고 다른 변수들하고만을 말하는걸까요?

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
김예지 댓글 2 좋아요 0 조회수 134

네이버커페크롤링

미해결

[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)

itmes 에 여러글이 담긴거 확인하고 밑에서 for문 돌리는데 맨위에 있는 글 하나만 뜨네요 뭔가 잘못했나 해서 확인했는데 어떤게 문제인거죵..

  • python
  • 웹-크롤링
진용 댓글 3 좋아요 0 조회수 192

수강기간 연장

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

0 안녕하세요,, 저는 필기 유효기간 마지막 실기시험을 2과목 40점, 3과목 10점으로 탈락했어요,, 빅분기실기 강의 유효기간이 11월 10일까지라서,, 급하게 다시 필기취득하고, 또다시 실기접수를 하였습니다. 유효기간이 며칠안남아서,, 혹시 일주일만 더 연장해주실 수 있나요? 아니면 추가 비용납부해서 연장이 가능할까요?

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
lovelove567 댓글 1 좋아요 0 조회수 151

회사 내 환경 자원에서 수강중인데 아나콘다 유료로 회사내에서는 설치가 되지 않습니다.

미해결

프로그래밍 시작하기 : 도전! 45가지 파이썬 기초 문법 실습 (Inflearn Original)

회사 내 환경 자원에서 수강중인데 아나콘다 유료로 회사내에서는 설치가 되지 않습니다. 아나콘다 설치가 불가능할경우 주피터 노트북 환경 설정 가이드를 알수는 없을까요?

  • python
jeongsoo_e.lee 댓글 2 좋아요 0 조회수 324

로지스틱 회귀관련

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

안녕하세요? 강사님이 저술하신 빅데이터분석기사 실기관련해서 로지스틱회귀 419쪽 문제 중에 p-value가 0.05보다 작은 유의한 변수만 사용한 ~~~~ 여기서 교재는 독립변수로 age , service, booked가 되었는데. service도 0.05 넘는 독립변수가 아닌지요? 이 것도 제외 해야 하는것이 아닌지요?

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
kccjjang 댓글 2 좋아요 0 조회수 151

제가 이해한 칸토어집합 문제를 풀어서 써봤습니다.

해결됨

세계 대회 진출자가 알려주는 코딩테스트 A to Z (with Python)

나중에 강의를 복습 할 때 제가 어떤식으로 문제에 접근하고 이해하고 강의를 들었는지 회고 하기 위해서 기록 해둡니다. 또한 제가 이해한 부분이 다른 분들에게 도움이 되면 더 좋겠습니다. 목표 문자열 길이가 주어지면 길이가 1이 될때까지 - - 형태로 바꾸는 문제 제약조건 1 <= N <= 12 어떻게 해결? 입출력 결과를 보면 아래와 같이 추론이 가능하다. ans[0] = 3⁰ = 1 => - ans[1] = 3¹ = 3 => - - ans[2] = 3² = 9 => - - - - => ans[2-1] + 3²⁻¹ + ans[2-1] 결론적으로 => ans[i-1] + 3ⁱ ⁻ ¹ + ans[i-1] 이러한 규칙을 찾을 수 있다. 시간 복잡도 칸토어 집합은 0부터 N까지 각 단계별로 3⁰ + 3¹ + 3² + ... 3¹² 만큼의 문자열을 처리해야 하므로 모든 합이 전체 연상량이다. 0 <= N <= 12 ans[0] ~ ans[12] ans[i]의 길이 : 3ⁱ ans[0] : 1 ans[1] : 3 ans[2] : 9 - 위에 0,1,2일때 공백 - 합쳐서의 길이 등비수열

  • python
  • 코딩-테스트
  • 알고리즘
rhkdtjd_12 댓글 1 좋아요 2 조회수 194

인프런 강의 내용 자료

미해결

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

작업형3 강의에서 단일, 대응, 독립표본 간단하게 잘 정리해주신 것을 보여주셨는데 혹시 이런 강의자료들은 따로 다운받을수는 없을까요? 깃허브에서는 기본학습 심화학습 이렇게만 작성된 코드밖에 없더라구요,,

  • python
  • 머신러닝
  • 빅데이터
  • pandas
김정원 댓글 2 좋아요 0 조회수 121

iloc 범위 관련

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

line = int(X_train.shape[0]) X_train = all_df.iloc[:line, :].copy() X_train 이렇게 된 코딩은 iloc에서 line까지가 아니라 line-1까지 가져온다는 뜻 아닌가요? ㅜㅜ 강사님께서 line까지 가져온다고 말씀을 주셔서요.

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
김치현 댓글 2 좋아요 0 조회수 104

single 포스트글에서 페이지의 Top-Banner이미지 불러오는 법

해결됨

워드프레스(WordPress) 완전정복

질문이 많아서 죄송합니다... 질문 1, 2 로 나누었어요... 질문 2. 또, single 포스트글에서 Top-Banner쪽에서도 포스트글의 featured image가 아니라 샘플페이지1의 featured image를 불러오게 하고 싶은데… 그 전에 content-topBanner.php부분에서 이렇게 $postFeatureImg[0]변수를 이용하면 애초에 블로그 페이지(읽기 설정: ‘블로그’ 로 되어있습니다.)의 featured image조차도 불러와 지지가 않습니다. <section id="topBanner" class="mx-3" style="background-image: url('<?php if(is_home()) { // echo esc_url(get_theme_file_uri('assets/images/blog.jpg')); echo esc_url($postFeatureImg[0]); } elseif(is_archive()) { echo esc_url(get_theme_file_uri('assets/images/archive.jpg')); } elseif(is_singular('review')) { echo esc_url(get_theme_file_uri('assets/images/notebook.jpg')); } else { echo esc_url(has_post_thumbnail() ? $postFeatureImg[0] : get_theme_file_uri('assets/images/bg1.jpg')); } ?>')"> 질문 2-1. 어떻게 해야 블로그 페이지의 topBanner섹션에서 $postFeatureImg[0]변수를 통해 에디터에 설정된 featured image를 불러올 수가 있나요?(간단해 보여도 새벽 3시 넘어서까지 아무리 gpt를 돌려봐도 안되네요…ㅠㅠㅠㅠㅠㅠ) 현재 content-topBanner.php <?php include get_theme_file_path('inc/variables.php'); ?> <section id="topBanner" class="mx-3" style="background-image: url('<?php if(is_home()) { // echo esc_url(get_theme_file_uri('assets/images/blog.jpg')); echo esc_url($postFeatureImg[0]); } elseif(is_archive()) { echo esc_url(get_theme_file_uri('assets/images/archive.jpg')); } elseif(is_singular('review')) { echo esc_url(get_theme_file_uri('assets/images/notebook.jpg')); } else { echo esc_url(has_post_thumbnail() ? $postFeatureImg[0] : get_theme_file_uri('assets/images/bg1.jpg')); } ?>')"> <div class="section-content overlay d-flex justify-content-center align-items-center"> <div class="container"> <div class="text-center <?php echo ($text_align ? 'text-md-' . $text_align : ''); ?>"> <h1 class="display-4"><?php if(is_home()) { echo get_the_title(48); } elseif(is_archive()) { echo get_the_archive_title(); } else { the_title(); } ?></h1> <?php if(is_home()) { ?> <h4 class="fw-light"><?php esc_html_e('Our amazing posts!', 'myfourthwp'); ?></h4> <?php } elseif(is_archive()) { ?> <h4 class="fw-light"><?php the_archive_description(); ?></h4> <?php } else { if($subtitle) { ?> <h4 class="fw-light"><?php echo $subtitle; ?></h4> <?php } } ?> </div> </div> </div> </section> 현재 variables.php <?php // Post thumbnails global $post; // 이 줄을 추가합니다. if ($post) { // $post가 null이 아닐 때만 실행 $thumbnail_id = get_post_thumbnail_id($post->ID); $postFeatureImg = wp_get_attachment_image_src($thumbnail_id, 'full'); $postFeatureAlt = get_post_meta($thumbnail_id, '_wp_attachment_image_alt', true); // Post parent ID $theParent = wp_get_post_parent_id(get_the_ID()); } else { $thumbnail_id = null; $postFeatureImg = null; $postFeatureAlt = null; $theParent = null; } // Post parent ID $theParent = wp_get_post_parent_id(get_the_ID()); // Brand $telephone = get_field('telephone', 'user_1'); $ceo = get_field('ceo', 'user_1'); $registered_business_no = get_field('registered_business_no', 'user_1'); $address = get_field('address', 'user_1'); $logo_image = get_field('logo_image', 'user_1'); $kakao_place = get_field('kakao_place', 'user_1'); $facebook = get_field('facebook', 'user_1'); $twitter = get_field('twitter', 'user_1'); $kakao_channel = get_field('kakao_channel', 'user_1'); $youtube_channel = get_field('youtube_channel', 'user_1'); $kakao_map_api = get_field('kakao_map_api', 'user_1'); $latitude = get_field('latitude', 'user_1'); $longitude = get_field('longitude', 'user_1'); // Contact modal $contact_modal_text_body = get_field('contact_modal_text_body', 14); // Top banner $text_align = get_field('text_align'); $subtitle = get_field('subtitle'); // Event $event_date = get_field('event_date'); // Front Carousel $slides = get_field('slides');

  • wordpress
qkrtjdrbs125 댓글 2 좋아요 0 조회수 223

single 포스트글에서도 페이지의 $theParent를 가져오는 법

해결됨

워드프레스(WordPress) 완전정복

강사님 안녕하세요?(제가 좀 질문이 많아서 죄송합니다..ㅠㅠ 그렇지만 꼭 만들어야 해서요...ㅠㅠ) 강의내용을 토대로 블로그페이지에 하위 메뉴 샘플페이지1,2,3을 만들어 보았습니다.(크게 다른것 없이 셋 다 /* Template Name: Sample Template */으로 동일한 커스텀 템플릿입니다.) Sample Template의 내용으로는 ‘호스팅’이라는 카테고리(id=20)만 불러오도록 했습니다. 샘플페이지에 나타난 포스트카드를 클릭하면 해당 포스트글로 창이 넘어가는데요. 여기까지는 강의내용과 똑같습니다. 여기서 제가 한 가지 변화를 주고 싶은데요. single 포스트글의 전체적인 디자인이 샘플페이지1과 동일했으면 좋겠습니다. 그러니깐 샘플페이지1에서 좌측에 <aside>가 불러와져 있는데요. single 포스트글에서도 좌측에 <aside>가 불러오고 싶은데, 불러와지지가 않습니다. 물론 당연히도 if($theParent) { } 구문에서 $theParent변수에 할당된 것이 없어서 그렇겠지요? 질문 1. 그러면 어떻게 해야 single 포스트글에서도 샘플페이지1 에서 갖고 있는 $theParent변수와 같은 변수를 가져올 수 있나요? (질문이 많아서 나누었습니다..ㅠㅠ) 제가 만든 content-samplepage.php <?php include get_theme_file_path('inc/variables.php'); ?> <main id="sampleContent"> <div class="section-content"> <div class="container"> <div class="row"> <aside class="col-md-3 mb-4"> <?php if($theParent) { ?> <ul class="list-group shadow"> <p class="list-group-item list-group-item-action active mb-0" aria-current="true"> <?php echo get_the_title($theParent); ?> </p> <?php if($theParent) { $childrenList = $theParent; } else { $childrenList = get_the_ID(); } wp_list_pages(array( 'title_li' => NULL, 'link_before' => '<li class="list-group-item list-group-item-action">', 'link_after' => '</li>', 'sort_column' => 'menu_order', 'child_of' => $childrenList )); ?> </ul> <?php } ?> </aside> <article class="col-md-9 mb-4 fw-light"> <?php the_content(); ?> <?php $paged = get_query_var('paged') ? get_query_var('paged') : 1; $eventQuery = new WP_Query(array( 'post_type' => 'post', // 'posts_per_page' => 10, 'cat' => 20, 'paged' => $paged // 'category_name' => 'event' // 'order' => 'DESC', // 'orderby' => 'date' )); if($eventQuery->have_posts()) { ?> <div class="row row-cols-1 row-cols-sm-2 row-cols-md-3 gx-3 gy-2 grid"> <?php while($eventQuery->have_posts()) { $eventQuery->the_post(); include get_theme_file_path('inc/variables.php'); ?> <div class="col grid-item"> <div class="card mb-3"> <div class="row g-0"> <div class="col-4 post-featured" style="background-image: url('<?php echo esc_url(has_post_thumbnail() ? $postFeatureImg[0] : get_theme_file_uri('assets/images/bg1.jpg')); ?>')"> </div> <div class="col-8 post-text d-flex flex-column align-items-stretch"> <div class="card-body"> <h5 class="card-title mb-3"> <a href="<?php the_permalink(); ?>" class="text-decoration-none mb-3"><?php the_title(); ?></a> </h5> <p class="card-text fw-light text-truncate"> <?php if(has_excerpt()) { echo get_the_excerpt(); } else { echo wp_trim_words(get_the_content(), 10); } ?> </p> </div> <div class="card-footer border-0"> <small class="fw-light post-meta"> <?php post_meta(18); ?> </small> </div> </div> </div> </div> </div> <?php } ?> </div> <br /> <div class="row justify-content-center my-5"> <div class="col-md-8"> <?php fellowtuts_wpbs_pagination($eventQuery->max_num_pages); ?> </div> </div> <?php } else { echo '<div class="row justify-content-center">'; echo '<p class="text-center">'. esc_html__('Sorry, no events.', 'myfourthwp') .'</div>'; echo '</div>'; } wp_reset_postdata(); ?> </article> </div> </div> </div> </main> 제가 만든 page-sample.php <?php /* Template Name: Sample Template */ get_header(); while(have_posts()) { the_post(); get_template_part('template-parts/content/content', 'topBanner'); get_template_part('template-parts/content/content', 'samplepage'); } get_footer(); ?>

  • wordpress
qkrtjdrbs125 댓글 1 좋아요 0 조회수 200

label encoding error

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

n_train, n_test, c_train, c_test = get_nc_data() # 데이터 새로 불러오기 from sklearn.preprocessing import LabelEncoder le = LabelEncoder() for col in cols : le = LabelEncoder() c_train[col] = le.fit_transform(c_train[col]) c_test[col] = le.transform(c_test[col]) 이렇게 했는데, --------------------------------------------------------------------------- KeyError Traceback (most recent call last) /usr/local/lib/python3.10/dist-packages/pandas/core/indexes/base.py in get_loc(self, key) 3804 try: -> 3805 return self._engine.get_loc(casted_key) 3806 except KeyError as err: index.pyx in pandas._libs.index.IndexEngine.get_loc() index.pyx in pandas._libs.index.IndexEngine.get_loc() pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item() pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item() KeyError: 'age' The above exception was the direct cause of the following exception: KeyError Traceback (most recent call last) 2 frames /usr/local/lib/python3.10/dist-packages/pandas/core/indexes/base.py in get_loc(self, key) 3810 ): 3811 raise InvalidIndexError(key) -> 3812 raise KeyError(key) from err 3813 except TypeError: 3814 # If we have a listlike key, _check_indexing_error will raise KeyError: 'age' age와 관련된 이상한 오류가 뜨네요...

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
김치현 댓글 2 좋아요 0 조회수 159

chain 실행 오류가 납니다.

미해결

입문자를 위한 LangChain 기초 — v1.0+ 업데이트

13분 20초 영상과 같이 답변이 나오지 않는데 어떻게 진행해야할까요 추가적으로 SystemMessagePromptTemplate와 HumanMessagePromptTemplate 함수를 사용하는 이유는 무엇인지가 잘 와닿지 않습니다!

  • python
  • llm
  • langchain
  • openai-api
유동원 댓글 2 좋아요 0 조회수 256

2회 기출유형(작업형2)

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

2회 기출유형(작업형2)에서 랜덤포레스트나 XGB에서 하이퍼파라미터 (max_depth)같은거 지정해서 성능 높여도되는걸까요?

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
김예지 댓글 2 좋아요 0 조회수 137

웹훅 사용과 관련하여 질문 드립니다.

미해결

파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편

다이어그램을 면, 장고 서버에 네트워크 장애 등으로 인해 client에서 받은 콜백을 넘기지 못하는 경우 웹훅을 사용하는게 안정적이라 하셨는데, 네트워크 장애로 아임포트에서 웹훅 연결이 안되는 경우 처리가 어떻게 되는지 알고 싶습니다. retry가 얼마나 되는지, 대기를 얼마나 하는지 등 웹훅을 이용한 메시지 전송 보장이 어떻게 되는지 질문 드립니다. 만약, 웹훅의 100% 전송 보장이 안된다면 웹훅 또한 별도의 시나리오로 결과를 이중으로 확인 하도록 처리를 해야 하는 건지요? 실제 개발 하셨을 때에는 이 부분에 대해 어떻게 구현 하셨는지도 알고 싶습니다. 예를 들어 웹훅을 더 신뢰하는 것으로 가정한다면, 웹훅의 return을 기준으로 결과를 처리하고 일정 시간동안 타임아웃이 발생하면, 재결제를 시도하는 방식 등이 될거 같은데 실재로는 어떻게 구현이 되고 사용되는지 알고 싶습니다.

  • python
  • django
bluebamus 댓글 2 좋아요 0 조회수 282

원핫인코딩하고 train에 대입하면 CLIENTNUM 컬럼이 사라집니다.

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

train = pd.get_dummies(train[cols]) test = pd.get_dummies(test[cols]) 하고나면 train과 test에 인코딩된 컬럼만 보여집니다.

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
gogozira 댓글 2 좋아요 0 조회수 112

서브쿼리를 JOIN으로 바꾸기

미해결

[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]

안녕하세요! SUBQUERY 이해 (업데이트) 강의에서 예2의 비교 부분의 쿼리문을 JOIN으로 바꿔서 표현해보려고 하는데 실행 결과 category_id가 1부터 전부 나옵니다. 어떻게 해야 5('Comedy')보다 큰 것만 추출할 수 있을까요? pdf파일 7page JOIN으로 바꿔서 표현해본 쿼리문 실행 결과

  • python
  • sql
  • mysql
  • dbms/rdbms
김양희 댓글 1 좋아요 0 조회수 178

pyside6 설치 강의에 나오는 Qt for Python 확장 설치를 더이상 지원하지 않는답니다.

미해결

[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)

먼저 친절하고 자세한 강의 감사합니다. 덕분에 셀레니움을 이용해서 간단하지만 1차로 원하는 부분까지 개발해 봤습니다. 캠핑장 예약을 위해 아직 더 가야 하지만 버튼 하나로 조회 결과 화면까지 이동하는 건 확인했습니다. ㅎㅎ 질문입니다. pyside6 설치 강의에 나오는 Qt for Python 확장 설치를 더이상 지원하지 않는답니다. 섹션13 의 PySide6 설치 및 사용법 강의에 나오는 Qt for Python 을 검색하니 이 확장은 더 이상 사용되지 않습니다. 대신 Qt All Extensions Pack 확장자를 사용하세요. 라는 멧세지가 나옵니다. Qt All Extensions Pack 이걸 설치해도 강의 따라가는 데 문제가 없을까요? 설치 잘 못 되었다가는 꼬일 거 같아 대기중입니다. ㅠㅠ 감사합니다.

  • python
  • 웹-크롤링
dgroups72 댓글 2 좋아요 1 조회수 279

INFO sqlalchemy.engine.Engine ROLLBACK

해결됨

실전! FastAPI 입문

swagger 로 opt 생성, 검증 api 실행을 했더니 sqlalchemy.engine.Engine ROLLBACK 로그가 출력이 됩니다. 원인을 모르겠습니다... 로그 INFO: Application startup complete. INFO: 127.0.0.1:63654 - "GET /docs HTTP/1.1" 200 OK email-validator not installed, email fields will be treated as str. To install, run: pip install email-validator INFO: 127.0.0.1:63654 - "GET /openapi.json HTTP/1.1" 200 OK 2024-10-31 14:25:27,367 INFO sqlalchemy.engine.Engine SELECT DATABASE() 2024-10-31 14:25:27,367 INFO sqlalchemy.engine.Engine [raw sql] {} 2024-10-31 14:25:27,369 INFO sqlalchemy.engine.Engine SELECT @@sql_mode 2024-10-31 14:25:27,369 INFO sqlalchemy.engine.Engine [raw sql] {} 2024-10-31 14:25:27,369 INFO sqlalchemy.engine.Engine SELECT @@lower_case_table_names 2024-10-31 14:25:27,370 INFO sqlalchemy.engine.Engine [raw sql] {} 2024-10-31 14:25:27,372 INFO sqlalchemy.engine.Engine BEGIN (implicit) 2024-10-31 14:25:27,377 INFO sqlalchemy.engine.Engine SELECT user.id, user.username, user.password, todo_1.id AS id_1, todo_1.contents, todo_1.is_done, todo_1.user_id FROM user LEFT OUTER JOIN todo AS todo_1 ON user.id = todo_1.user_id WHERE user.username = %(username_1)s 2024-10-31 14:25:27,377 INFO sqlalchemy.engine.Engine [generated in 0.00018s] {'username_1': 'admin'} INFO: 127.0.0.1:63658 - "POST /users/log-in HTTP/1.1" 200 OK 2024-10-31 14:25:27,603 INFO sqlalchemy.engine.Engine ROLLBACK INFO: 127.0.0.1:63664 - "POST /users/email/otp HTTP/1.1" 200 OK 2024-10-31 14:26:02,514 INFO sqlalchemy.engine.Engine BEGIN (implicit) 2024-10-31 14:26:02,514 INFO sqlalchemy.engine.Engine SELECT user.id, user.username, user.password, todo_1.id AS id_1, todo_1.contents, todo_1.is_done, todo_1.user_id FROM user LEFT OUTER JOIN todo AS todo_1 ON user.id = todo_1.user_id WHERE user.username = %(username_1)s 2024-10-31 14:26:02,514 INFO sqlalchemy.engine.Engine [cached since 35.14s ago] {'username_1': 'admin'} INFO: 127.0.0.1:63671 - "POST /users/email/verify HTTP/1.1" 200 OK Sending email to admin@fastapi.com! 2024-10-31 14:26:12,519 INFO sqlalchemy.engine.Engine ROLLBACK src/database/ repository.py from typing import List, Optional from fastapi import Depends from sqlalchemy import select, delete from sqlalchemy.orm import Session from database.connection import get_db from database.orm import ToDo, User class ToDoRepository: def __init__(self, session: Session = Depends(get_db)): self.session = session def get_todos(self) -> List[ToDo]: return list(self.session.scalars(select(ToDo))) def get_todo_by_todo_id(self, todo_id: int) -> ToDo | None: return self.session.scalar(select(ToDo).where(ToDo.id == todo_id)) def create_todo(self, todo: ToDo) -> ToDo: self.session.add(instance=todo) self.session.commit() self.session.refresh(instance=todo) return todo def update_todo(self, todo: ToDo) -> ToDo: self.session.add(instance=todo) self.session.commit() self.session.refresh(instance=todo) return todo def delete_todo(self, todo_id: int) -> None: self.session.execute(delete(ToDo).where(ToDo.id == todo_id)) self.session.commit() class UserRepository: def __init__(self, session: Session = Depends(get_db)): self.session = session def get_user_by_username(self, username: str) -> User | None: return self.session.scalar(select(User).where(User.username == username)) def save_user(self, user: User) -> User: self.session.add(instance=user) self.session.commit() self.session.refresh(instance=user) return user src/service/ user.py import random import time import bcrypt from datetime import datetime, timedelta from jose import jwt class UserService: encoding: str = "UTF-8" JWT_SECRET_KEY: str = "f002393019e8776398370aa671767b860b702854724591cd0da5fc97bda3daf1" JWT_ALGORITHM: str = "HS256" def hash_password(self, plain_password: str) -> str: hashed_password: bytes = bcrypt.hashpw( plain_password.encode(self.encoding), salt=bcrypt.gensalt() ) return hashed_password.decode(self.encoding) def verify_password( self, plain_password: str, hashed_password: str ) -> bool: return bcrypt.checkpw( plain_password.encode(self.encoding), hashed_password.encode(self.encoding) ) def creat_jwt(self, username: str) -> str: return jwt.encode( { "sub": username, "exp": datetime.now() + timedelta(days=1), }, self.JWT_SECRET_KEY, algorithm=self.JWT_ALGORITHM ) def decode_jwt(self, access_token: str) -> str: payload: dict = jwt.decode( access_token, self.JWT_SECRET_KEY, algorithms=[self.JWT_ALGORITHM] ) return payload["sub"] @staticmethod def create_otp() -> int: return random.randint(1000, 9999) @staticmethod def send_email_to_user(email: str) -> None: time.sleep(10) print(f"Sending email to {email}!") src/api/ user.py from fastapi import APIRouter, Depends, HTTPException, BackgroundTasks from cache import redis_client from database.orm import User from database.repository import UserRepository from schema.request import SignUpRequest, LoginRequest, CreateOTPRequest, VerifyOTPRequest from schema.response import UserSchema, JWTResponse from security import get_access_token from service.user import UserService router = APIRouter(prefix="/users", tags=["USER"]) @router.post("/sign-up", status_code=201) def user_sign_up_handler( request: SignUpRequest, user_service: UserService = Depends(), user_repository: UserRepository = Depends(), ): hashed_password: str = user_service.hash_password( plain_password=request.password ) user: User = User.create( username=request.username, hashed_password=hashed_password ) user: User = user_repository.save_user(user) return UserSchema.from_orm(user) @router.post("/log-in", status_code=200) def user_log_in_handler( request: LoginRequest, user_service: UserService = Depends(), user_repository: UserRepository = Depends(), ): user: User | None = user_repository.get_user_by_username( username=request.username ) if not user: raise HTTPException(status_code=404, detail="User Not Found") verified: bool = user_service.verify_password( plain_password=request.password, hashed_password=user.password ) if not verified: raise HTTPException(status_code=401, detail="Not Authorized") access_token: str = user_service.creat_jwt(username=user.username) return JWTResponse(access_token=access_token) @router.post("/email/otp") def create_otp_handler( request: CreateOTPRequest, _: str = Depends(get_access_token), user_service: UserService = Depends() ): otp: int = user_service.create_otp() redis_client.set(request.email, otp) redis_client.expire(request.email, 3 * 60) return {"otp": otp} @router.post("/email/verify") def verify_otp_handler( request: VerifyOTPRequest, background_tasks: BackgroundTasks, access_token: str = Depends(get_access_token), user_service: UserService = Depends(), user_repo: UserRepository = Depends(), ): otp: str | None = redis_client.get(request.email) if not otp: raise HTTPException(status_code=400, detail="Bad Request") if request.otp != int(otp): raise HTTPException(status_code=400, detail="Bad Request") username: str = user_service.decode_jwt(access_token=access_token) user: User | None = user_repo.get_user_by_username(username) if not user: raise HTTPException(status_code=404, detail="User Not Found") background_tasks.add_task( user_service.send_email_to_user, email="admin@fastapi.com" ) return UserSchema.from_orm(user)

  • python
  • 리팩토링
  • orm
  • FastAPI
  • pytest
포팃 댓글 1 좋아요 0 조회수 242

==

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

~와 같다라는 식을 쓸때 =가 아닌 == 로 표기하는 이유가 있을까요?

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
shs4166 댓글 2 좋아요 0 조회수 87

인기 태그

인프런 TOP Writers

주간 인기글