AWS 라이트세일로 서버를 생성했으니 서버에 파이보를 설치해 오픈해보자. 먼저 SSH를 사용해 서버에 접속하자.

접속하면

호스트 명이 ip-172-26-3-166 으로 되어있는데 sudo hostnamectl set-hostaname <원하는이름> 명령으로 바꿀수 있다.

바꾼 후 에는 sudo reboot 명령으로 재시작 하자.

 

그 후 서버 시간설정을  바꾸자.

date 명령을 해보면 시간이 UTC 시간이 출력된다. 이것을 sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime  명령을 하면 date 명령을 해 다시 시간을 확인해보면 KST 로 변경된것을 알 수 있다.

 

장고를 사용하려면 파이썬이 설치되어 있어야한다. python 명령어를 입력해 파이썬이 설치되어있는지 확인해보자.

python 을 치면 python3 를 입력해보라는 말이 나온다. python3 명령을 해보면 잘 설치 되어있는것으로 나온다. 잘 설치되어 있는것을 알았으니 exit() 를 쳐 파이썬 셸을 종료하자.

 

가상환경을 설치하기 전에 일단 sudo apt update 명령을 하자.

우분투 패키지를 최신으로 업그레이드 해야 가상환경을 설치할 수 있다.

그 후 sudo apt install python3-venv 명령을 하자.

설치가 진행되는데 확인 질문들은 모두 Y 를 눌러 진행하자.

 

설치를 다 진행한 후 홈디렉토리(/home/ubuntu) 하위에 파이보가 필요로 하는 projects, venvs 디렉토리를 생성해주자. ls 명령어로 디렉토리가 잘 생성되었는지 확인해보자.

그 후 새로 만든 venvs 폴더로 이동해 장고 가상환경을 생성하자.

python3 -m venv mysite 명령을 한 후 기다리면 된다. 그리고 만든 가상 환경에 진입해 보자.

mysite 하위 bin 디렉토리로 진입 후 . activate 혹은 source activate 명령어를 입력해 가상환경으로 진입하자.

진입한 가상환경에서 wheel, django, markdown 패키지를 순서대로 설치해 주자.

설치를 다 진행한 후 파이보 관련 파일을 설치하자. 파이보 관련파일은 깃허브 원격 저장소에 저장했다. 서버에서 깃을 이용해 파이보 관련 파일을 내려받자.

일단 깃허브에 저장한 원격저장소 URL 을 복사하자.

주소 복사 후 cd ~/projects 명령으로 ~/projects 디렉토리로 이동하자.

~/projects 위치에서 git clone <깃허브 원격저장소 URL> mysite 명령을 하면 자동으로 내려받아진다. 그 후 ls 명령을해 mysite 디렉토리가 생성되었는지 확인하자.

생성된 mysite 폴더로 이동하자.

이동한 후 python manage.py runserver 로 서버를 실행시키면 python manage.py migare 명령을 수행하라는 오류가 나온다.

깃허브에는 .gitignore 에 의해 db.sqlite3 파일이 저장되지 않았기 때문이다. 하지만 데이터베이스를 생성하기 위한 작업 파일들은 pybo/makemigrations 디렉토리에 존재하므로 makemigrations 명령을 할 필요 없이 python manage.py migrate 명령으로 데이터베이스를 생성할 수 있다. CONTROL-C 로 장고 서버를 종료 후 python manage.py migrate 명령을 하자. 그렇게하면 db.sqlite3 파일이 생성된다.

migrate 를 했다면 다시 서버를 구동하는데 이번엔 python manage.py runserver 0:8000 명령으로 서버를 구동해보자.

0의 의미는 외부에서 이 서버에 접속할 수 있도록 IP를 개방한다는 의미이고 :8000 은 8000번 포트로 접속을 허용한다는 의미이다.

서버를 시작 후 http://<고정 IP> 를 입력하면 (ex : http://3.38.64.56)

 

 

이러한 오류페이지가 나온다. 장고 서버를 외부에 서비스 하려면 settings.py 파일의 ALLOWED_HOSTS 항목을 설정해줘야 하는데 설정되어있지 않아서 발생하는 오류다. 장고의 ALLOWED_HOSTS 는 보안과 관련된 항목으로 장고 서버가 실행가능한 호스트를 등록하는 설정 항목이다. 호스트 등록을 위해 내 PC의 settings.py 파일을 수정하자.

ALLOWED_HOSTS 에 고정 IP를 입력해주자. 변경 사항을 서버에 적용하기 위해 먼저 파일을 깃허브에 저장 후 다시 서버에서 그 파일을 다운받아야 한다. 

파이참 터미널에서

git add *

git commit -m "ALLOWED_HOSTS 변경"

git push 명령을 순서대로 하자.

깃허브에 정상적으로 업로드 했다.

그 후 터미널에서 ssh -i mysite.pem ubuntu@고정IP 명령어로 AWS 터미널로 들어가 git pull 명령을해 깃허브에서 다운로드하자.

~/projects/mysite 위치에서 git pull을 하자. git config credential.helper store 를 하면 깃허브인증을 생략할 수 있다. 이제 서버를 다시 시작해보자. 이 절차들은 mysite 가상환경에서 진행되어야한다.

서버를 재 시작 후 http://고정IP:8000에 접속해보자.

드디어 서버가 파이보를 오픈했다.

이제 누구나 웹브라우저에 http://3.38.64.56:8000 을 입력하면 내가만든 파이보에 접속할 수 있다!!

'Django > 따라하는 장고' 카테고리의 다른 글

36. WSGI(위스키)  (0) 2022.12.09
35. settings.py 분리  (0) 2022.12.05
33. 서버 접속 설정 및 프로그램  (0) 2022.11.30
32. 서버  (0) 2022.11.30
31. 깃허브  (0) 2022.11.29

AWS 서버에 접속하기 위해서 고정IP 와 방화벽 해제가 필요하다. 고정 IP는 말그대로 IP가 변하지 않고 고정된 IP 이다. 

먼저 AWS 라이트세일의 메인화면에서 네트워킹 탭을 눌러 고정 IP 생성을 누르자.

버튼을 누르면 

인스턴스 선택에서 Ubuntu-1 을 선택 후 생성 버튼을 누르자.

 

그렇게 하면 고정 IP주소가 생성된다.

파이보 서비스의 기본 포트 번호가 8000이다. 외부에서 8000번 포트로 접속하려면 방화벽 해제 작업을 해야 한다.

AWS 메인화면에서 인스턴스 탭에서 Ubuntu-1 을 눌러보자.

그 후 네트워킹 탭에서 아래 [ + 규칙추가 ] 버튼을 누르자.

포트 또는 범위에 8000을 누른 후 생성을 누르자. 이렇게 하면 8000 포트의 방화벽 해제를 했으므로 외부에서 고정 IP 의 8000 포트로 접속이 가능해진다.

 

이제 파이보를 서버에 적용해야 한다. 서버에 접속하여 프로그램을 설치하고 환경 설정을 진행하자. 서버 작업을 위한 도구 SSH 를 설치해보자. SSH 는 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템(서버)의 명령을 수행하기 위한 프로토콜(기본포트 : 22 번).

 

먼저 SSH 프로그램으로 서버에 접속하기 위해서 AWS의 계정 프라이빗 키가 필요하다.

우 상단에 계정 버튼을 누르면 나오는 화면에서 SSH키 탭에서 아래에 있는 버튼을 눌러 프라이빗 키를 다운로드하자.

그리고 그 키는 .../vens 로 이동후 이름을 mysite.pem 으로 바꾸자.

그리고 터미널을 열어 .../vens 위치까지 이동 후 chmod 400 mysite.pem 명령을 해주자.

마지막으로  ssh -i mysite.pem ubuntu@본인의 고정 IP 주소 를 입력하면

서버에 접속이 된다. 이제 서버에 접속한 터미널을 이용해 서버작업을 할 수 있다.

'Django > 따라하는 장고' 카테고리의 다른 글

35. settings.py 분리  (0) 2022.12.05
34. 파이보 오픈  (0) 2022.11.30
32. 서버  (0) 2022.11.30
31. 깃허브  (0) 2022.11.29
30. 깃  (0) 2022.11.29

우리가 지금까지 제작한 파이보를 누구나 사용할 수 있게 하려면 서버를 열어야 한다. 서버를 위해 장비를 사고 설치하고 관리하는데에 많은 시간과 돈이 필요하지만 요새는 클라우드 시스템으로 서버를 이용하면 모든 절차가 생략된다. 이번에는 Amazon Web Service, AWS 를 사용할 것이다. AWS는 조금 비싸지만 AWS Lightsail 로 저렴하게 서버를 구성해보자.

AWS 라이트세일은 아마존에서 운영하는 웹서비스 특화 클라우스 서비스다. 그리고 AWS 라이트세일 첫 3개월 무료이기 때문에 이것으로 서버를 열어보자. 먼저 AWS 에 가입해보자. 가입할 때 영문주소를 써야하는데 이 사이트에서 영문주소를 번역해서 가입하자. 

http://juso.go.kr 

 

주소정보누리집(도로명주소 안내시스템)

 

juso.go.kr

가입할 때 Support 플랜을 선택할 때 기본지원 - 무료 플랜을 선택하자.

가입한 후 https://lightsail.aws.amazon.com 

 

https://lightsail.aws.amazon.com/ls/webapp

 

lightsail.aws.amazon.com

AWS 라이트세일에 로그인하자.

오른쪽 하단에 English 를 눌러 한국어로 바꾸자. 그 후 인스턴스 생성을 눌러보자. 

플랫폼 Linux/Unix 를 선택하고 OS 전용을 누른후 Ubuntu 를 선택후 

5달러 플랜을 선택하자. 3.5 달러 플랜은 메모리가 부족하여 적당하지 않다.

 

 

이름을 변경해도 되고 Ubuntu-1 로 냅둬도 된다. 마지막으로 인스턴스 생성을 누르자.

생성을 누르면 대기중이다. 시간이 지나면 

실행중 으로 바뀌면 서버가 생성된것이다.

'Django > 따라하는 장고' 카테고리의 다른 글

34. 파이보 오픈  (0) 2022.11.30
33. 서버 접속 설정 및 프로그램  (0) 2022.11.30
31. 깃허브  (0) 2022.11.29
30. 깃  (0) 2022.11.29
29. 파이보 추가 기능  (0) 2022.11.24

저번에 깃을 이용해 저장소를 생성하고 소스코드를 관리했다. 이것을 원격 저장소로 관리하기 위해 깃허브를 사용하자. 먼저 깃허브에 가입을 하자.

new repository 를 해서 새로운 원격 저장소를 생성하주자. 그렇게 하면

이러한 URL이 나오는데 이것을 로컬 저장소와 연결해주는것이다.

터미널에 git remote add origin <깃허브에있던 URL> 을해서 연결하자.

이 명령을 한 후 오류가 발생하지 않으면

git push -u origin main 명령어를 치면 깃허브의 Username 과 Password 를 치는곳이 나오는데 Username 을 치고 Password 를 쳐야한다. 하지만 맥 기준으로는 깃허브의 비밀번호가 아닌 token을 입력해줘야한다. 이 토큰은 깃허브에서 세팅-개발자세팅-토큰 에서 토큰을 만들어서 나오는 토큰을 복사해 Password 입력칸에 붙여넣기 하면된다.

Settings - Developer settings 에 들어가 Personal access tokens 에 Tokens(classic)을 누르면 나오는 화면에서 Generate new token 을 누르면 이름을 설정하고 체크하는게 여러개 나오는데 사실 뭐가 뭔지 잘 모르겠어서 일단 다 체크했다. 그렇게 하면 코드같은게 나오는데 그것을 복사 붙여넣기 하면 된다.

이제 깃허브를 보면 정상적으로 파일들이 원격저장소로 올라간것을 알 수 있다. 여러번 사용해보면서 익숙해져야 할 것 같다.

'Django > 따라하는 장고' 카테고리의 다른 글

33. 서버 접속 설정 및 프로그램  (0) 2022.11.30
32. 서버  (0) 2022.11.30
30. 깃  (0) 2022.11.29
29. 파이보 추가 기능  (0) 2022.11.24
28. 검색 기능  (0) 2022.11.24

코드를 작성하다보면 수정과 삭제가 빈번하게 발생하고, 과거에 삭제한 부분을 살리거나 언제 어느부분을 수정했는지 확인해야할 때 가 있기도 하다. 여러명이서 작업할 때는 소스코드를 여러명이서 수정하고 왜 수정했는지 이유가 필요할 때가 있다. 이를 위해 Git 을 설치하고 사용해보자. 

터미널에

git --version 이라고 쳐서 버전이 나오면 다운로드가 되어있는것이다. 안나온다면

Homebrew 를 설치하고 brew install git 을 해서 git을 다운로드하자.

먼저 저장소(repository)을 만들자.

그리고 git status 명령을 실행하자.

git status 는 현재 저장소의 상태를 출력해 준다. 아직 관리되지 않고 있는 파일(Untracked files)들을 보여주고 git add 명령을 이용하여 관리할 파일들을 추가하라고 알려준다. 

 

git add 명령 수행전에 깃으로 관리해야 할 파일들을 고려해야 한다. 직접 작성한 mysite, pybo 디렉토리 등은 깃으로 관리해야 할 대상이 맞지만 .idea, sqlite3 파일은 사용자별, 시스템 별로 달라지기 때문에 깃으로 관리하면 안된다. .idea는 사용자 설정을 저장하는 파이참 전용 파일이고, db.sqlite3 파일은 SQLite의 데이터베이스 파일이다. 예를 들어 여러 명이 같은 저장소에서 작업할 때 .idea 파일을 누군가가 변경한다면 내가 설정했던 파이참 설정 내용이 다른 사람의 것으로 변경될 수 도있다. 이런 문제를 방지하기 위해 .gitignore 파일을 작성해 깃으로 관리하지 않을 대상을 설정해 줘야한다.

projects\mysite\.gitignore 위치에 새로운 파일을 생성하자.

이제 하려던 git add 명령을 해보자.

git add * 명령을 하자.

git add 뒤에 * 을 추가해 명령어를 수행한 이유는 모든 파일을 추가하겠다는 의미이다. 

그 후  git status 를 해보자.

이렇게 하면 깃 스테이지 영역에 추가된 파일을 확인할 수 있다. 깃은 저장소에 변경 사항을 바로 저장하지 않고 스테이징 이라는 단계를 거친다. 스테이징은 변경 사항을 저장소에 저장하기 직전 단계에 올려놓는 개념이다. 먼저 git add 로 스테이징에 올려놓고 git commit 으로 스테이지에있는 파일을 저장소에 저장한다.

 

이제 git commit 명령으로 저장하자.

git commit 명령을 수행하면 먼저 이메일 주소 와 사용자명을 설정하라고 적혀있다. 본인의 이름과 이메일 주소를 사용하자.

그 후 git commit -m '파이보 프로젝트 최초 커밋'

git status 를 하면 잘 적용된것을 볼 수 있다.

그런데 점프 투 장고 저자는 오류가 나지 않았었지만 나는 .gitignore 을 설정 했는데 modified : .gitignore 하면서 오류가 났었는데

git rm -r --cached . 
git add .

명령어로 git 의 cache 를 초기화 해주니 해결 되었다.

 

이제 변경사항이 없고 작업 공간이 깨끗하다는 정보를 확인할 수 있다.

 

이번엔 base.html 템플릿 파일의 <title> 엘리먼트를 다음과 같이 바꿔보자.

projects\mysite\templates\base.html 를 수정하자.

수정 한 후 git status 명령을 해보자.

수정된것이 있다고 한다.

git diff 를 해보자.

q 를 입력하면 창에서 나갈 수 있다.

무엇이 수정되었는지 확인할 수 있다.

- 는 삭제된 부분, + 는 추가된 부분이다.

코드의 변경 내역을 되돌리고 싶을 때는 git restore 명령을 수행하면 된다.

파일의 이름은 git status 명령을 했을때 출력된 파일명을 기준으로 적으면 된다. git restore 를 해보면 다시 내용이 복구된것을 확인할 수 있다.

다시 <title>파이보</title> 로 변경하고 git commit 명령을 해보자.

그럼 오류와 함께 git add 명령을 하거나 또는 git commit -a 명령을 하라는 메세지가 나온다. -a 옵션은 커밋할 때 add 명령도 함께 처리하라는 옵션이다.

-a 옵션을 추가해 커밋해보자.

깃으로 커밋한 이력을 확인하려면 git log 명령을 해보자.

'Django > 따라하는 장고' 카테고리의 다른 글

32. 서버  (0) 2022.11.30
31. 깃허브  (0) 2022.11.29
29. 파이보 추가 기능  (0) 2022.11.24
28. 검색 기능  (0) 2022.11.24
27. 마크다운  (0) 2022.11.23

https://wikidocs.net/75418

 

3-15 파이보 추가 기능

이 책에서 구현할 파이보의 기능은 아쉽지만 여기까지이다. 함께 더 많은 기능을 추가하고 싶지만 이 책은 파이보의 완성이 아니라 파이보를 성장시키며 얻게 되는 경험을 전달하는 것을…

wikidocs.net

현재 이 튜토리얼을 따라 장고를 배우고 있는데, 이 책에서 구현할 기능은 여기까지지만 우리가 평소에 사용하는 게시판을 생각해보면 알듯이 더 다양한 기능들이 있다. 댓글, 카테고리, 비밀번호 찾기 및 변경, 프로필 등 이있다. 이런 것들은 나중에 따로 공부해보면 추가해보겠다. 그 전에 이 책의 저자가 더 다양한 파이보 기능들을 구현해 놓은 파이보 게시판이있다.

들어가서 확인해보면 완성형의 파이보 게시판을 볼 수 있다.

https://pybo.kr/pybo/question/list/qna/

 

질문과답변 - 파이보

 

pybo.kr

 

'Django > 따라하는 장고' 카테고리의 다른 글

31. 깃허브  (0) 2022.11.29
30. 깃  (0) 2022.11.29
28. 검색 기능  (0) 2022.11.24
27. 마크다운  (0) 2022.11.23
26. 앵커  (0) 2022.11.23

게시판에서 검색기능은 필수이다. 검색의 대상은 제목, 질문의 내용, 질문의 작성자, 답변의 내용, 답변의 작성자가 있다. 

 

이런 조건으로 검색하려면 질문 목록을 조회하는 부분을 다음처럼 수정해야 한다. 일단 눈으로만 보자.

from django.db.models. import Q

kw = request.GET.get('kw', '') # 검색어

if kw:
    question_list = question_list.filter(
        Q(subject__icontains=kw) | # 제목 검색
        Q(content__icontains=kw) | # 내용 검색
        Q(answer__content__icontains=kw) | # 답변 내용 검색
        Q(author__username__icontains=kw) | # 질문 글쓴이 검색
        Q(answer__author__username__icontains=kw) # 답변 글쓴이 검색
).distinct()
        

Q 함수는 OR 조건으로 데이터를 조회하기 위해 사용하는 함수이다. 제목,내용,글쓴이를 or 조건으로 검색하기위해 사용했다. 그리고 filter 함수 뒤에서 사용된 distinct 조회 결과에 중복이 있을 경우 중복을 제거하여 리턴하는 함수이다.

위 코드에서 kw 는 화면으로 부터 전달받은 검색어이다. 그리고 kw 값은 POST 가 아닌 GET 으로 읽도록 했다. GET 은 가져온다는 개념이고, POST 는 수행한다는 개념이라고 볼수있다. GET 은 글늬 내용에 대한 목록을 보여주는 경우나, 글의 내용을 보는 경우이고, POST 는 글의 내용을 저장하고, 수정할 때 사용한다. 

kw = request.GET.get('kw', '') # 검색어

이처럼 작성되었기 때문에 kw 는 다음처럼 GET 방식으로 전달되어야 index 함수에서 읽을 수 있다.

http://localhost:8000/?kw=파이썬&page=1

만약 kw 를 GET이 아닌 POST 방식으로 전달하는 방법으로 한다면 page 파라미터도 POST 방식으로 전달되어야 한다. 하지만 그렇게 한다면 새로고침이나 뒤로가기 등을 했을 때 만료된 페이지라는 오류를 만난다. POST 방식은 동일한 POST 요청이 발생할 경우 오류를 발생시키기 때문이다. 그러므로 게시물 목록을 조회할 때는 GET 방식을 사용하는 것이 좋다.

 

이제 화면에서 kw 와 page 를 동시에 GET 방식으로 호출하는 방법에 대해서 알아보자.question_list.html 템플릿에 검색어를 입력할 수 있는 텍스트 창을 추가하자.

projects\mysite\templates\pybo\question_list.html 에 추가하자.

<table>태그 상단 우측에 검색어를 입력할 수 있는 텍스트창을 생성하였다. 맨 밑에 있던 질문 등록하기 버튼은 검색창의 좌측으로 이동했다. 그리고 자바스크림트에서 이 텍스트창에 입력된 값을 읽기 위해 다음처럼 id 속성을 추가했다.

<input type="text"

id="search_kw"

class="form-control" value="{{ kw|default_if_none:'' }}">빨간 줄로 그은 부분은 삭제해주자.

 

 

그리고 page 와 kw 를 동시에 GET 으로 요청할 수 있는 searchForm 을 다음과 같이 추가하자.projects\mysite\templates\pybo\question_list.html 에 추가하자.

GET 방식으로 요청해야 하므로 method 속성에 "get" 을 설정했다. kw 와 page 는 이전에 요청했던 값을 기억하고 있어야 하므로 value에 값을 대입했다. 이전에 요청했던 kw와 page의 값은 index 함수로부터 전달될 것이다. action 속성은 '폼이 전송되는 URL'이므로 질문 목록 URL인 {% url 'index' %} 를 지정했다.

 

기존 페이징 처리하는 부분도 ?page=1 처럼 직접 파라미터를 코딩하는 방식에서 값을 읽어 폼에 설정할 수 있도록 변경해야한다.

projects\mysite\templates\pybo\question_list.html 을 변경하자.

모든 페이지 링크를 href 속성에 직접 입력하는 대신 data-page 속성으로 값을 읽을 수 있도록 변경했다.

 

그리고 page, kw 파라미터를 동시에 요청할 수 있는 자바스크립트를 다음과 같이 추가하자.

projects\mysite\templates\pybo\question_list.html 에 추가하자.

작성한 자바스크립트 코드를 살펴보자면,

만약 다음과 같이 class 속성 값으로 'page-link' 라는 값을 가지고 있는 링크를 클릭하면

<a class="page-link" data-page="{{ question_list.previous_page_number }}" 
href="javascript:void(0)">이전</a>

이 링크의 data-page 속성값을 읽어 searchForm 의 page 필드에 설정하여 searchForm 을 요청하도록 다음과 같은 스크립트를 추가했다.

const page_elements = document.getElementsByClassName("page-link");
Array.from(page_elements).forEach(function(element) {
    element.addEventListener('click', function() {
        document.getElementById('page').value = this.dataset.page;
        document.getElementById('searchForm').submit();
    });
});

그리고 검색버튼을 클릭하면 검색어 텍스트창에 입력된 값을 searchForm 의 kw 필드에 설정하여 searchForm 을 요청하도록 다음과 같은 스크립트를 추가했다.

const btn_search = document.getElementById("btn_search");
btn_search.addEventListener('click', function() {
    document.getElementById('kw').value = document.getElementById('search_kw').value;
    document.getElementById('page').value = 1;  // 검색버튼을 클릭할 경우 1페이지부터 조회한다.
    document.getElementById('searchForm').submit();
});

검색 버튼을 클릭하는 경우 새로운 검색에 해당되므로 page 에 항상 1을 설정하여 요청하도록 했다.

 

마지막으로 요청한 검색어가 질문 목록에 조회되도록 수정하자.

projects\mysite\pybo\views\base_views.py 의 index 함수를 수정하자.

Q 함수내에 사용된 subject__icontains=kw 의 의미는 제목에 kw 문자열이 포함되어있는지를 의미한다.

answer__author__username__icontains 는 답변을 작성한 사람의 이름이 포함되는가? 라는 의미이다. filter 함수에서 모델 속성에 접근하기 위해서는 __ (언더스크롤 두개) 를 이용하여 위 속성에 접근할 수 있다.

subject__contains=kw 대신 subject__icontains=kw 를 하면 대소문자 가리지 않고 찾아 준다.

그리고 page와 kw 를 템플릿에 전달하기 위해 context 딕셔너리에 추가했다.

테스트를 해보자.

검색어에 마크다운이라고 입력한 후 찾기를 눌러보면 마크다운 이라는 제목을 가진 질문만 나온다.

 

'Django > 따라하는 장고' 카테고리의 다른 글

30. 깃  (0) 2022.11.29
29. 파이보 추가 기능  (0) 2022.11.24
27. 마크다운  (0) 2022.11.23
26. 앵커  (0) 2022.11.23
25. 추천 기능  (0) 2022.11.23

질문이나 답변을 작성할 때 일반적인 텍스트 외에 글자를 진하게 표시하거나 링크를 추가하고 싶을 경우 '마크다운' 이라는 글쓰기 도구를 입력하면 표현할 수 있다.

먼저 마크다운의 문법을 간단하게 알아보자.

 

[마크다운 문법]

 

목록을 표시하기 위해 

* 파이썬
* 장고
* 알고리즘

이런식으로 글을 쓸 때 작성하면 위의 문자열을 마크다운 해석기가 HTML로 변환하면 실제 화면에서는 다음과 같이 보인다.

● 파이썬
● 장고
● 알고리즘

 

순서가 있는 목록을 표시하려면

1. 하나
1. 둘
1. 셋

이렇게 글을 작성하면

1. 하나
2. 둘
3. 셋

이런식으로 변환되어 작성된다.

 

작성한 글자를 강조하려면 

장고는 **파이썬**으로 만들어진 웹 프레임워크이다.

이런식으로 강조할 텍스트 양쪽에 **을 넣어주면

장고는 파이썬으로 만들어진 웹 프레임워크이다.

 

링크를 추가하려면 [링크명](링크주소) 규칙을 적용하면 된다.

파이썬 홈페이지는 [http://python.org](http://www.python.org) 입니다.

라고 작성하면

파이썬 홈페이지는 http://www.python.org 입니다.

이렇게 변환되어 결과가 나온다.

 

소스코드는 백쿼트 ` 를 3개 연이어 붙여 위아래를 감싸면 된다.

```
def add(a, b):
        return a+b
```

이렇게 작성하면

def add(a, b):
	return a+b

이런식으로 변환된다.

 

이제 마크다운 모듈을 설치 해보자.

터미널에 pip install markdown 명령어를 입력하자.

다운이 정상적으로 완료되었다.

마크다운으로 작성한 문서를 HTML 문서로 변환하려면 템플릿에서 사용할 마크다운 필터를 작성해야 한다. 이전에 sub 필터를 작성했던 pybo_filter.py 파일에 다음과 같이 mark 필터를 추가하자.

projects\mysite\pybo\templatetags\pybo_filter.py 에 추가하자.

mark 함수는 markdown 모듈과 mark_safe 함수를 이용해 입력 문자열을 HTML 로 변환하는 필터 함수이다. 마크다운에는 몇 가지 확장 기능이 있는데 파이보는 위처럼 nl2br 과 fenced_code 를 사용했다. nl2br 는 줄바꿈 문자를 <br> 로 바꾸어주고 fenced_code 는 위에서 살펴본 마크다운의 소스코드 표현을 위해 필요하다.

 

이제 질문상세템플릿에 {% load pybo_filter %} 태그를 추가하고 마크다운 필터를 적용하자

projects\mysite\templates\pybo\question_detail.html 에 추가하자.

줄바꿈을 표시하기 위해 사용했던 기존의 style="white-space: pre-line;" 스타일을 삭제하고 {{ question.content|mark }} 같이 마크다운 필터를 적용했다.

 

답변 내용에도 마크다운 필터를 적용하자.

 

이제 테스트해보기 위해 

이렇게 작성을 해 본다면

마크다운 필터에 의해 자동으로 변환되어 작성된다.

'Django > 따라하는 장고' 카테고리의 다른 글

29. 파이보 추가 기능  (0) 2022.11.24
28. 검색 기능  (0) 2022.11.24
26. 앵커  (0) 2022.11.23
25. 추천 기능  (0) 2022.11.23
24. views.py 분리  (0) 2022.11.21

+ Recent posts