Dev./Django & DRF

Django : 웹 프로그래밍의 이해

Ivan'show 2023. 7. 21.
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

댓글