-웹서버와 파이썬을 설치하는 방법을 간단히 정리한다.
-CGI로 파이썬과 웹서버를 연동하는 방법을 학습한다.
-생활코딩의 파이썬 강의를 기반으로 학습하였다.
-파이썬은 3.9.2 ver를 사용한다.
웹서버 설치
웹서버로 사용하기 위한 bitnami WAMP라는 것을 설치해야 한다. java와 톰캣 등만 사용하다보니 생소한 용어 및 프로그램들이 많이 나와서 차근차근 정리해야겠다.
bitnami WAMP란 bitnami라는 오픈소스 통합 소프트웨어 번들을 제공하는 기업에서 제공하는 통합 솔루션이다.
WAMP는 Window, Apache, Mysql, Php의 약자라고 한다. 이 것들을 한 번에 설치, 사용할 수 있는 프로그램이다.
위의 링크에서 본인 OS에 맞는 WAMP를 설치할 수 있다.
설치 후 http://127.0.0.1로 접속하여 아래와 같은 화면이 나온다면 설치 성공이다.
IDE는 Atom을 사용하려고 한다. VSCode 등을 사용해도 되지만 강의에 맞춰 사용해보려고 한다.
Atom에서 File - Open Folder로 bitnami/C:\Bitnami\wampstack-8.0.2-1\apache2\htdocs 폴더를 선택한다.
htdocs는 루트디렉토리로 웹브라우저의 요청이 오면 웹서버에서 가장 먼저 찾는 경로이다.
index.html의 내용을 다 지운 후 Hello python!!이라고 입력 후 저장하였다.
이후 127.0.0.1/index.html로 접속하면 화면에 Hello python!!이라고 쓴 것이 출력됨을 확인할 수 있다.
파이썬 설치
위 링크에서 받으면 된다.
위의 Add Python 3.9 to PATH를 체크해줘야 CLI 환경에서도 사용할 수 있다고한다.
우리가 설치한 파이썬은 파이썬 인터프리터로 우리가 입력한 명령을 인터프리터가 해석하여 파이썬을 실행해야 한다.
일단 cmd를 실행한다.
cmd에서 python이라고 입력하면 버전 확인 및 python mode로 들어갈 수 있다. 여기서 1+1 등을 입력하면 인터프리터에 의해 결과값을 확인할 수 있다.
exit()로 빠져나갈 수 있다.
자주 사용되는 계산 등의 로직은 파일을 만들어 사용할 수 있다.
htdocs 폴더에 helloworld.py라는 파일을 만든 후 다음과 같은 코드를 입력했다.
a=2+3+4
b=a/3
print(b)
그리고 cmd창에서 아래와 같은 명령어를 입력하여 htdocs폴더로 이동하였다.(python mode에서 나온 후 입력해야 함)
cd C:\Bitnami\wampstack-8.0.2-1\apache2\htdocs
여기서 아까 저장한 helloworld.py를 실행시키려면 다음과 같이 입력하면 된다.
python helloworld.py
또는
helloworld.py라고만 입력해도 확장자 .py만 보고 실행할 수 있다.
계산 결과를 print하여 3.0이 나오는 것을 확인할 수 있다.
CGI를 통한 Apache와 Python 연동
127.0.0.1/helloworld.py에 접속해보면 계산 결과가 아닌 그냥 위의 입력한 명령어가 HTML로 그대로 출력되는 것을 확인할 수 있다. 아파치에서는 정적인 텍스트 해석만 가능하기 때문에 파이썬을 이용해 프로그래밍적으로 계산되어 출력되도록 작업이 필요하다.
이 작업이 CGI를 통한 아파치와 파이썬의 연동 작업이다.
우선 Open Folder로 C:\Bitnami\wampstack-8.0.2-1 디렉토리를 연다. 여기서 apache2\conf\httpd.conf 파일을 연다.
mod_cgi로 검색하면 다음과 같은 코드를 찾을 수 있다.
LoadModule cgi_module modules/mod_cgi.so
이 코드가 주석처리(#) 되어 있으면 풀어주자.
그리고 좀 내려가보면 다음과 같은 코드가 있다.
#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "C:/Bitnami/wampstack-8.0.2-1/apache2/htdocs"
<Directory "C:/Bitnami/wampstack-8.0.2-1/apache2/htdocs">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.4/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# AllowOverride FileInfo AuthConfig Limit
#
AllowOverride None
#
# Controls who can get stuff from this server.
#
Require all granted
</Directory>
여기서 DocumentRoot가 웹서버에서 파일들을 찾을 루트 위치다.
아래의 Directory는 DocumentRoot에서 할 수 있는 작업에 대한 옵션 설정을 하는 곳이다.
여기서 최하단에 다음과 같은 코드를 입력한다.
<Files "*.py">
Options ExecCGI
AddHandler cgi-script .py
</Files>
</Directory>
.py로 끝나는 파일들은 CGI로 실행한다는 의미이다.
WAMP 프로그램을 실행시켜서 아파치 웹서버를 재시작한다. 처음에 Restart를 눌러도 제대로 안 되서 Stop->Start를 하니 제대로 작동하였다. 아래와 같은 화면이 뜬다면 CGI가 연동된 것이라고 볼 수 있다.
이후 에러 로그는 apache2\logs\error.log에서 확인할 수 있다.
에러 로그들을 다 지우고 다시 접속해서 다음과 같은 에러가 떠야 한다.
[Mon Mar 08 20:42:38.294234 2021] [win32:error] [pid 8228:tid 1244] [client 127.0.0.1:60211] AH02102: C:/Bitnami/wampstack-8.0.2-1/apache2/htdocs/helloworld.py is not executable; ensure interpreted scripts have "#!" or "'!" first line
[Mon Mar 08 20:42:38.294234 2021] [cgi:error] [pid 8228:tid 1244] (9)Bad file descriptor: [client 127.0.0.1:60211] AH01222: don't know how to spawn child process: C:/Bitnami/wampstack-8.0.2-1/apache2/htdocs/helloworld.py
첫줄을 보면 helloworld.py는 실행할 수 없으며 인터프리트된 스크립트에서 "#!"나 "'!"가 첫줄에 있어야 한다 라는 것을 알 수 있다.
다음과 같이 코드를 수정한다.
#!python
a=2+3+4
b=a/3
print("content-type: text/html; charset=utf-8\n")
print(b)
맨 윗줄에 #!python이 추가된 것을 확인할 수 있다. 그런데 4번째 줄에 print'print("content-type: text/html; charset=utf-8\n")가 추가되었다.
강의에서는 그냥 일단 특정 사이트(python.org) 접속시 크롬개발자도구 network에서 Response Header의 Content-Type을 복붙하여 보여줬는데 Content-Type 캐릭터셋을 이런 식으로 맞춰야되는 것 같다. 정확한 것은 배우면서 포스팅 수정이 필요하겠다.
어쨋뜬 이 코드가 없으면 Internal Error가 나고 Response Header의 Content-Type이 text/html; charset=iso-8859-1로 나온다. utf-8로 맞춰주는 print문을 넣고 실행해보자.
위와 같이 입력한 수식이 계산되어 3.0이 반환되는 것을 볼 수 있다.
'개발자 일지 > Phython' 카테고리의 다른 글
[파이썬 기초]데이터타입 - list, 기타 컨테이너 타입(튜플,딕셔너리) (0) | 2021.03.16 |
---|---|
[파이썬 기초]open() 함수로 파일 읽기 (2) | 2021.03.15 |
[파이썬 기초]제어문 - 조건문(if)과 논리연산자(and,or) (0) | 2021.03.14 |
[파이썬 기초]데이터타입-Boolean다루기 (0) | 2021.03.14 |
[파이썬 기초]URL 쿼리스트링(Query String) 가져오기 (0) | 2021.03.12 |
[파이썬 기초]홈페이지 CGI 구현하기 (0) | 2021.03.10 |
[파이썬 기초]데이터타입-숫자,문자열 다루기 (0) | 2021.03.10 |
[개인적인 포스팅]파이썬을 시작 하는 이유 (0) | 2021.03.07 |