게시판 app을 만들기로 계획하면서 커뮤니티 게시판과 공지사항 게시판은 다르게 만들어보고 싶었는데, 어떤 게시글 안에 자주 등장하는 단어를 필터링하여 다른 게시글에서도 등장하면 게시글들을 가져와 게시글 하단에 연관 게시글이 추가로 보이게 화면에 그리는 게 목표였다. 게시글에서 등장하는 단어를 필터링하기 위해선 형태소 분석을 한 단어들이 몇 번 등장했는지 카운트한 뒤, 제일 많이 많이 등장한 단어를 가지고 다른 게시글들에 해당 단어로 필터링한 후 게시글을 정렬하도록 코드를 작성해 봤다. 한글 형태소 분석기는 Okt, Komoran, Kkma, Mecab가 있는데 프로젝트에는 Okt를 사용했다. (각 형태소 분석기마다 연산속도가 다를 수 있고, 한글 문장 안에 영어 및 숫자가 있을 경우 오류가 발생할 수 있..
Magazine B은 여느 웹사이트와 동일하게 아이디와 비밀번호로 로그인을 하며, 회원가입 조건은 아이디와 비밀번호, 이름 이메일이 필수 입력 조건이지만 아이디와 비밀번호 이메일에는 특정 문자 입력 조건이 있으며 이메일 휴대전화는 조건이 따로 없었다. Magazine K 회원가입 조건 → 회원 아이디와 이메일과 비밀번호는 파이썬 정규표현식을 만족해야 하며, 아닐 시 400 에러를 반환한다. → 입력한 회원 아이디가 이미 중복된 아이디일 경우, 400 에러를 반환한다. → 프론트에서 보내주는 key값에 대한 오류 발생 시 key error 400를 반환한다. → 회원가입 성공 시 201 반환한다. views.py HTTP 통신으로 받은 method 종류에 따라 수행하는 방법을 정의해야 하는데, 회원가입은 ..
초기 제품 모델링 매거진을 판매하는 웹 사이트를 선정하여 모델링 중 메인 카테고리와 서브카테고리를 나눴으나, 제품이 많지 않기 때문에 카테고리가 많지 않아도 될 것같다는 판단하에, 메인과 서브 카테고리를 나누지 않고 합치게되었다. 초기 모델링 -> 변경된 모델링 → 문제 발생 추후 기능구현 중 메인 카테고리에 대한 정보만 전달하고 싶은데 서브 카테고리 값도 불러오게되서 코드에 의미없는 슬라이싱이 추가되는 등 이상한 코드가 되어버렸다. related_name 활용한 모델링 → related_name 활용 many to many field 에서 역참조할때 _set 사용 대신 직접 이름을 지정하여 이 이름으로 역참조를 할 수 있게 만들어주는 related_name을 이런 경우에 사용할 수 있다는 멘토님의 조언..
path Variable GET method를 통해 데이터를 넘길 경우 경로를 변수로 사용한다. (특정 인덱스에 대한 조회) Django에서 제품의 상세페이지 url 주소를 path Variable를 활용하여 설정하는 방법을 정리해봤다. http://127.0.0.1:8000/products/1 제품의 상세페이지의 경우 제품의 id로 url 주소를 만들기 위해 products app의 urls.py와 models.py 코드를 수정 # products/urls.py 파일 from products.views import ProductDetailView urlpatterns = [ path('/', ProductDetailView.as_view()), ] # products views.py 파일 class P..
전 포스팅의 회원가입 구현과 회원 로그인 구현에서 사용자의 중요 정보(비밀번호)를 암호화하지 않았기 때문에 이번에는 bcrypy 라이브러리를 이용하여 어떤 방식으로 암호화를 하고 암호화한 사용자 정보를 어떻게 매칭 시켜 로그인이 되는지 과정을 정리해봤다. (이 포스팅에서 사용한 bcrypy 외에 장고 공식 문서에도 비밀번호를 어떤 방식으로 암호화하는지, 또 어떤 라이브러리가 있는지 확인 할 수 있다.) brcypy공식 문서에서 사용 방법을 보고 나름대로 이해한 것을 간략하게 정리했다. → bcrypy 설치 및 import → 클라이언트로부터 받은 정보 중 비밀번호를 데이터 테이블에 저장 시 암호화하여 저장 (회원가입) → 회원 로그인 시 입력 받은 비밀번호와 암호화하여 저장한 비밀번호를 encode하여 ..
회원 로그인 구현 이전에 작성한 회원가입 구현에 이어 간단한 회원 로그인을 구현해봤다. 먼저 회원 로그인 구현 시 중요한 점은 로그인 또한 사용자의 정보를 받는 것이기 때문에 보안이 필요하다. POST 방식은 GET방식과 다르게 URL에 붙여서 보내지 않고 HTTP BODY에 정보를 넣어 보내기 때문에 POST 방식으로 만들어야 한다. 또한, ★중요★ 사용자의 비밀번호는 암호화해서 db에 저장해야 하는데 이전 포스팅과 이 포스팅에는 적용하지 않았다. 암호화는 이후 공부하며 다시 재 포스팅하는 것으로 ^^... 그리고 마찬가지로 사전에 설치한 HTTPIE를 이용해 서버에 요청을 보내고 그에 따른 작업을 수행하고 요청에 맞는 응답을 보내도록 노력했다... models.py 모델링 조건 → 이름, 이메일, 비..
QuerySet? 쿼리 셋은 데이터베이스로부터 전달받은 객체의 목록(list)이다. 또한, 쿼리셋은 lazy 하기 때문에 생성 작업을 할 때에는 데이터 베이스에서 데이터를 가져오지 않는다고 한다. >>> q = Entry.objects.filter(headline__startswith="What") >>> q = q.filter(pub_date__lte=datetime.date.today()) >>> q = q.exclude(body_text__icontains="food") >>> print(q) # 장고의 쿼리셋은 위 pritn문에서 데이터베이스에 들어가 데이터를 가져온다. # 이전 작업에서는 데이터베이스에서 정보를 가져오지 않는다. ★ queryset을 살펴보기 전에 데이터 베이스를 살펴보자 데이터..
장고는 manytomanyfield를 제공하기 때문에 사용자가 매핑 테이블(중간 테이블)을 직접 만들지 않아도 되지만 직접 만들어보았다. 필드 사용과 미사용 시 비교됬던 부분 직접 매핑 테이블을 구현했을 때 - 사용자가 직접 중간 테이블에서 서로의 id값을 넣어줘야 한다. (데이터가 많으면 관리가 어려울 것 같다) - many to many field를 사용하지 않았기 때문에 매핑테이블로 직접 들어가서 정보를 가져와야한다. 장고에서 제공하는 many to many field를 사용했을 때 - 사용자가 중간 테이블을 이용하고 싶다면 through 옵션을 통해 직접 중간 테이블을 지정할 수 있다. - 필드를 정의했기 때문에 참조 시 매핑 테이블을 들어가지않고 필드로 정의한 변수(?)를 통해 간접적으로 정보를..
튜토리얼3 에서는 앞서 만든 튜표 어플리케이션(polls)의 공개 인터페이스인 뷰(view)를 다음과같이 4개를 만들어 보자. 질문 “색인” 페이지 – 최근의 질문들을 표시합니다. (index) 질문 “세부” 페이지 – 질문 내용과, 투표할 수 있는 서식을 표시합니다. (detail) 질문 “결과” 페이지 – 특정 질문에 대한 결과를 표시합니다 (resulrts) 투표 기능 – 특정 질문에 대해 특정 선택을 할 수 있는 투표 기능을 제공합니다. (vote) 뷰(view) 추가하기 튜토리얼에 나와있는 대로 polls/views.py 에 4개의 뷰(view)를 보이기 위한 코드를 추가한다. (편하게 말하자면 클라이언트가 보는 웹페이지 화면) # 최근 질문들을 표시하는 '색인' 페이지 def index(req..
- Total
- Today
- Yesterday
- 환경 변수 설정
- 암호화
- git공부
- 면접을 위한 CS 전공 지식 노트
- authenticate()
- 톰캣
- git
- django-environ
- 회원 로그인
- 검색 결과 내 페이지네이션
- 커맨드 객체
- musma
- django.contrib.auth
- Java
- 혼자 공부하는 파이썬
- path variable
- Spring
- 디자인 패턴
- Magazine K
- python3
- Django tutorial
- git 공부
- API
- 회원가입
- 한글 형태소 분석기
- error: failed to push some refs to 'https://github.com/
- 웹페이지
- Python
- django
- 배열
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |