728x90
반응형
웹 클라이언트
- 웹 서버에서 정보를 요청하고 수신하는 소프트웨어 프로그램
클라이언트 요청?
- 웹 브라우저를 사용한 요청
- 리눅스 curl 명령을 사용하여 요청
- 리눅스 telnet 을 사용하여 요청
- 직접 만든 클라이언트로 요청
프론트엔드와 백엔드
- 프론트엔드 - 웹 클라이언트 (브라우저, 디바이스 등) : 사용자 인터페이스 작성 등 + HTML, CSS, Javascript 등 사용
- 백엔드 - 서버 (네트워크로 연결되어 있는 원격지의 컴퓨터) : 사용자가 직접 볼 수 없는 사이트의 로직, 데이터 처리, 성능, 보안, 인증, 권한 기능 개발, 트래픽처리, 안정화 등등 + Python, Java, PHP, Node.js, Ruby 등 사용
- 풀스택 - 프론트 + 백
HTTP
Hyper Text Transfer Protocol
메시지 예시
HTTP 메시지의 구조
- 시작줄(start line)
- 헤더 (header)
- 본문 (body)
HTTP 프로토콜
클라이언트는 요청 메시지를 보내고, 서버는 응답 메시지를 받는다.
요청 메시지에는 다음 정보가 포함된다.
- 메서드 : GET, POST, PUT, DELETE 중 하나
- 리소스 URI
- 헤더 : 요청에 대한 추가 정보
- 본문 : 요청에 대한 데이터
응답 메시지에는 다음 정보가 포함된다.
- 상태코드 : 200 OK, 404 Not Found, 500 Internal Server Error 등등
- 헤더 : 응답에 대한 추가 정보
- 본문 : 요청에 대한 결과 데이터
상태코드
URL
ULR 설계
- 프로토콜 : URL 에 사용되는 프로토콜을 나타낸다. HTTP 또는 HTTPS 일 수 있다. 요즘은 대부분 HTTPS 로 사용한다. HTTP 는 정보 탈취 문제가 심각하기 때문이다.
- 호스트명 : 웹 서버의 호스트명으로 도메인 이름 또는 IP 주소로 표현할 수 있다.
- 포트 번호 : 웹 서버 내의 서비스 포트 번호이다. 생략 시 디폴트 포트 번호로 HTTP = 80, HTTPS = 443 을 사용한다.
- 경로 : 파일 또는 애플리케이션 경로를 나타낸다.
- 쿼리 문자열 : 질의 문자열로 앰퍼샌드 (&) 로 구분된 이름 = 값 형식으로 표현된다.
- 프래그먼트 : 문서 내의 앵커 등 조작을 지정한다.
웹 서버
- 클라이언트의 요청을 받아 정적 및 동적 콘텐츠를 제공한다.
- 웹 사이트의 백엔드에서 실행된다.
- Apache, Nginx 및 IIS 와 같은 소프트웨어로 구현될 수 있다.
웹 애플리케이션 서버
- 클라이언트의 요청을 받아 웹 애플리케이션의 비즈니스 로직을 처리한다.
- 웹 애플리케이션의 백엔드에서 실행된다.
- JavaEE, .NET, PHP 와 같은 플랫폼에서 실행되는 소프트웨어로 구현될 수 있다.
웹 라이브러리
웹 클라이언트 라이브러리
웹 서버에 요청을 보내는 소프트웨어인 웹 클라이언트에서 사용하는데 편리하게 해주는 라이브러리
- urllib
- requests
- selenium
웹 서버 라이브러리
웹 사이트의 핵심 구성 요소이며 웹 사이트의 콘텐츠를 웹 브라우저에 제공하는 웹 서버에서 사용하는데 편리하게 해주는 라이브러리
- http.server 모듈
- flask
- django
urllib 모듈 써보기
# urlib.request 모듈
import urllib.request
url = '<https://www.google.com>'
request = urllib.request.Request(url)
response = urllib.request.urlopen(request)
html = response.read()
print(html)
# urllib.request 모듈 실습
import http.client
from urllib.parse import urljoin, urlunparse
from urllib.request import urlopen, urlretrieve
from html.parser import HTMLParser
from pathlib import Path
class ImageParser(HTMLParser):
def __int__(self):
super().__init__()
self.result = []
def handle_starttag(self, tag, attrs):
if tag != 'img':
return
if not hasattr(self, 'result'):
self.result = []
for name, value in attrs:
if name == 'src':
self.result.append(value)
def parse_image(date):
parser = ImageParser()
parser.feed(date)
# set 에 담아서 중복을 제거
data_set = set(x for x in parser.result)
return data_set
def download_image(url, data):
download_dir = Path('DOWNLOAD')
download_dir.mkdir(exist_ok=True)
parser = ImageParser()
parser.feed(data)
data_set = set(x for x in parser.result)
for x in sorted(data_set):
image_url = urljoin(url, x)
basename = Path(image_url).name
target_file = download_dir / basename
print(target_file)
print("Downloading...", image_url)
urlretrieve(image_url, target_file)
def main():
url = '<https://google.com>'
with urlopen(url) as f:
charset = f.headers.get_params('charset')[1][1]
data = f.read().decode(charset)
host = "www.google.com"
conn = http.client.HTTPConnection(host)
conn = request('GET', '')
resp = conn.getresponse()
charset = resp.msg.get_param('charset')
print('charset: ', charset)
data = resp.read().decode(charset)
conn.close()
data_set = parse_image(data)
print('\\n>>>>> Fetch Images from', url)
print('\\n'.join(sorted(data_set)))
if __name__ == '__main__':
main()
http.client 모듈 써보기
# http.client 모듈
import http.client
# 연결 설정
conn = http.client.HTTPConnection('www.google.com')
# 요청 보내기
conn.request('GET', '/')
# 응답 받기
response = conn.getresponse()
# 응답 출력
print(response.read())
# b'<!doctype html><html itemscope="" it ....
# http.client 모듈 실습
import http.client
from urllib.parse import urljoin, urlunparse, urlencode
from urllib.request import urlopen, urlretrieve
from html.parser import HTMLParser
from pathlib import Path
class ImageParser(HTMLParser):
def __int__(self):
super().__init__()
self.result = []
def handle_starttag(self, tag, attrs):
if tag != 'img':
return
if not hasattr(self, 'result'):
self.result = []
for name, value in attrs:
if name == 'src':
self.result.append(value)
def parse_image(date):
parser = ImageParser()
parser.feed(date)
# set 에 담아서 중복을 제거
data_set = set(x for x in parser.result)
return data_set
def download_image(url, data):
download_dir = Path('DOWNLOAD')
download_dir.mkdir(exist_ok=True)
parser = ImageParser()
parser.feed(data)
data_set = set(x for x in parser.result)
for x in sorted(data_set):
image_url = urljoin(url, x)
basename = Path(image_url).name
target_file = download_dir / basename
print(target_file)
print("Downloading...", image_url)
urlretrieve(image_url, target_file)
return data_set
def main():
host = "www.google.com"
conn = http.client.HTTPConnection(host)
conn.request('GET', '')
resp = conn.getresponse()
charset = resp.msg.get_param('charset')
print('charset: ', charset)
data = resp.read().decode(charset)
conn.close()
data_set = parse_image(data)
print('\\n>>>>> Downloading...', host)
url = urlunparse(('http', host, '', '', '', ''))
print('>>>>>', url)
download_image(url, data)
if __name__ == '__main__':
main()
http.server 모듈 써보기
# http.server 모듈
from http.server import HTTPServer, BaseHTTPRequestHandler
class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200, 'OK')
self.send_header('content-Type', 'text/plain')
self.end_headers()
self.wfile.write(b'Hellow World')
server = HTTPServer(("", 8080), SimpleHTTPRequestHandler)
# server = http.server.HTTPServer(("", 8080), SimpleHTTPRequestHandler)
server.serve_forever()
728x90
반응형
'Dev. > Django & DRF' 카테고리의 다른 글
Django : DRF 적용하기 (0) | 2023.08.15 |
---|---|
Django : DRF - quick start (0) | 2023.08.15 |
Django : 시작하기 (0) | 2023.08.09 |
Django : 프로그램 구조 이해하기 (0) | 2023.08.02 |
Django : 장고에 대해서 (0) | 2023.07.22 |
댓글