python 풀스택 개발 기초 지식 학습 - WEB 프로그래밍: CGI 및 WSGI 소개

7171 단어 python 창고 학습

카탈로그

  • CGI(Common Gateway Interface) 공통 게이트웨이 인터페이스
  • 1, 소개
  • 1.웹 서버 작동 방식
  • 2.CGI 부족
  • 2, CGI 어플리케이션
  • WSGI(Web Server Gateway Interface)
  • 1, 소개
  • 1.동기
  • 2.WSGI 소개
  • 2, WSGI 프로토콜
  • 3, WSGI는 간단한 웹 프레임워크를 실현한다
  • CGI(Common Gateway Interface) 공통 게이트웨이 인터페이스


    1. 소개


    1. 웹 서버 작업 방식


    웹 서버 처리 프로세스의 첫 번째 단계는 웹 서버가 클라이언트로부터 요청(즉 GET 및 POST 요청)을 받고 해당하는 응용 프로그램을 호출하는 것이다.그런 다음 클라이언트도 HTML 페이지를 기다립니다.응용 프로그램 처리가 완료되면 생성된 동적 HTML 페이지를 서버에 되돌려주고 서버에서 이 최종 결과를 사용자에게 되돌려줍니다.서버는 테이블의 처리주 프로세스에 대해 외부 응용 프로그램과 상호작용을 하여 생성된 HTML 페이지를 CGI를 통해 클라이언트에게 반환합니다.
    클라이언트가 웹 서버에 입력한 폼은 처리 과정과 백그라운드 데이터베이스에 저장된 폼을 포함할 수 있습니다.기억해야 할 것은 사용자 입력 항목(예를 들어 텍스트 상자, 라디오 단추), Submit 단추, 그림이 포함된 웹 페이지는 어떤 CGI 활동과 관련이 있다는 것이다.

    2. CGI의 부족


    CGI는 명백한 한계가 있고 웹 서버가 클라이언트를 동시에 처리하는 수량을 제한하기 때문에 일반적인 생산 환경의 웹 응용 프로그램에서는 CGI를 사용하지 않는다.

    둘째, CGI 응용 프로그램


    CGI 응용 프로그램은 전형적인 응용 프로그램과 약간 다른데 주로 입력, 출력과 사용자와 프로그램의 상호작용에 차이가 있다.CGI 스크립트가 시작되면 사용자가 제공한 폼 데이터를 가져와야 하지만, 이 데이터는 서버나 하드디스크에서 가져와야 합니다. 이것이 바로 요청입니다.표준 출력과 달리 이러한 출력은 화면, GUI 창, 하드 드라이브가 아닌 연결된 웹 클라이언트로 전송됩니다.이러한 반환된 데이터는 일련의 유효한 헤더 파일이 있는 HTML 레이블 데이터여야 합니다.웹 클라이언트가 브라우저인 경우 브라우저가 유효한 HTTP 데이터만 인식하기 때문에 오류가 발생합니다.CGI 응용 프로그램은 사용자와 스크립트 간에 어떠한 상호작용도 하지 않으며, 모든 상호작용은 웹 클라이언트 (사용자 기반 행위), 웹 서버 측과 CGI 응용 프로그램 간에 발생할 것이다.

    WSGI(Web Server Gateway Interface)


    1. 소개


    1. 동기


    CGI 방식은 확장할 수 없습니다. CGI 프로세스(Python 해석기와 약간 유사)는 모든 요청을 작성하고 다 쓰면 버립니다.만약 응용 프로그램에 수백 수천 개의 요청이 있을 때, 대량의 언어 해석기 프로세스를 만들면 대량의 자원을 소모하여 서버가 멈추게 됩니다.이 문제에 대해 두 가지 해결 방법이 있다. 하나는 서버 통합이고, 다른 하나는 외부 프로세스이다.
    서버 통합, 서버 API라고도 합니다.현재 가장 광범위한 서버 솔루션은 Apache HTTP 웹 서버입니다. 이것은 오픈소스 솔루션으로 통상적으로 Apache라고 불리며 서버 API를 가지고 있습니다.또한 용어 모듈을 사용하여 서버에 삽입된 컴파일된 구성 요소를 설명합니다. 이 구성 요소들은 서버의 기능과 용도를 확대할 수 있습니다.서버는 일반적으로 데이터 압축, 보안, 에이전트, 가상 호스트 등의 기능을 제공할 수 있다.
    CGI를 서버 외부에 적용하여 실행하는 외부 프로세스입니다.요청이 들어왔을 때 서버는 이 요청을 외부 프로세스로 전달합니다.이 방식은 요청을 처리한 후에 종료하는 것이 아니라 외부 프로세스가 오래 존재하기 때문에 순수한 CGI보다 확장성이 좋다.외부 프로세스에서 가장 널리 알려진 솔루션을 사용할 때 FastCGI.외부 프로세스가 서로 다른 호출 메커니즘을 사용하기 때문에 개발자에게 새로운 부담이 생겼다.응용 프로그램 자체를 개발해야 할 뿐만 아니라 웹 서버와의 통합도 결정해야 한다.이것은 사용자의 유연성을 제한한다. 이것은python이 아니다.이로 인해 WSGI(Web Server Network Class Interface) 표준이 만들어졌습니다.

    2. WSGI 소개


    WSGI는 서버도 아니고 프로그램과 상호작용하는 API도 아니고 실제 코드도 아니다. 정의된 인터페이스일 뿐이다. WSGI 규범은 날로 증가하는 서로 다른 웹 프레임워크, 웹 서버 및 기타 호출 방식(예를 들어 순수한 CGI, 서버 API, 외부 프로세스)을 처리하는 데 사용된다.WSGI의 목표는 웹 서버와 웹 프레임워크 층 사이에 일반적인 API 표준을 제공하여 상호작용을 줄이고 통일된 호출 방식을 형성하는 것이다.
    다음 WSGI의 간단한 예제를 참조하십시오.
    from wsgiref.simple_server import make_server
    
    
    def application(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        return [b'

    Hello, web!

    '] httpd = make_server('', 8080, application) print('Serving HTTP on port 8000...') # HTTP : httpd.serve_forever()

    WSGI의 정의에 따르면 이 응용 프로그램은 호출 가능한 대상입니다. 매개 변수는 다음과 같은 두 가지로 고정됩니다. 하나는 서버 환경 변수를 포함하는 사전이고, 다른 하나는 호출 가능한 대상입니다. 이 대상은 HTTP 상태 코드와 클라이언트에게 되돌아오는 HTTP 헤더를 사용하여 응답을 초기화합니다.
    전체 응용 프로그램 () 함수 자체는 HTTP를 해석하는 부분과 관련이 없다. 즉, 밑바닥 코드는 우리가 직접 작성할 필요가 없다. 우리는 더욱 높은 차원에서 요청에 어떻게 응답하는지 고려하기만 하면 된다.
    응용 프로그램 () 함수는 WSGI 서버에서 호출해야 합니다.WSGI 규범에 맞는 서버가 많기 때문에 우리는 하나를 골라서 사용할 수 있다.
    Python에 WSGI 서버가 내장되어 있습니다. 이 모듈은 wsgiref라고 합니다.
    application() 함수는 WSGI 표준에 부합하는 HTTP 처리 함수로서 두 개의 매개 변수를 수신합니다.
        //environ: HTTP dict ;
        
        //start_response: HTTP 。
    

    애플리케이션 () 함수에서 호출:
    start_response('200 OK', [('Content-Type', 'text/html')])
    

    HTTP 응답을 보낸 Header입니다. Header는 한 번만 보낼 수 있습니다. 즉, start_response () 함수입니다.start_response () 함수는 두 개의 매개 변수를 수신합니다. 하나는 HTTP 응답 코드이고, 하나는 list로 표시된 HTTP Header입니다. 각 Header는 두 개의str를 포함하는tuple로 표시합니다.
    일반적으로 Content-Type 머리카락을 브라우저에 보내야 합니다.다른 자주 사용하는 HTTP Header도 보내야 합니다.
    그리고 함수의 반환값b'

    Hello, web!

    '은 HTTP 응답의 Body로 브라우저에 전송됩니다.
    WSGI가 있으면 엔비론이라는 dict 대상에서 어떻게 HTTP 요청 정보를 얻고 HTML을 구성하는지에 관심이 있습니다. start_를 통해response()는 Header를 보내고 마지막으로 Body로 돌아갑니다.

    2. WSGI 프로토콜


    WSGI 프로토콜은 주로 서버와 애플리케이션 두 부분을 포함합니다.
  • WSGI 서버는 클라이언트로부터 요청을 받고 리퀘스트를 응용 프로그램에 전송하며 응용 프로그램이 되돌아오는response를 클라이언트에게 되돌려줍니다.
  • WSGI 응용 프로그램은 서버에서 전송된request를 수신하여 요청을 처리하고 처리 결과를 서버에 되돌려줍니다.응용 프로그램에는 여러 개의 잔식 중간부품(middlewares)을 포함할 수 있다. 이런 중간부품은 서버와 응용 프로그램을 동시에 실현해야 하기 때문에 WSGI 서버와 WSGI 응용 프로그램 사이에서 조절 작용을 할 수 있다. 서버에 대해서는 중간부품이 응용 프로그램을, 응용 프로그램에 대해서는 중간부품이 서버를 한다.

  • WSGI 프로토콜은 서버와 응용 프로그램의 결합을 해결하는 규범을 정의한 것이다. 즉, WSGI 서버를 실현할 수 있는 서버가 여러 개 있고 WSGI 응용 프로그램을 실현할 수 있는 프레임워크가 여러 개 있다. 그러면 임의의 서버와 응용 프로그램 조합을 선택하여 자신의 웹 응용을 실현할 수 있다.예를 들어 uWSGI와 Gunicorn은 모두 WSGI 서버 프로토콜을 실현한 서버이고 Django, Flask는 WSGI 응용 프로그램 프로토콜을 실현한 웹 프레임워크로 프로젝트의 실제 상황에 따라 조합하여 사용할 수 있다.

    3. WSGI는 간단한 웹 프레임워크를 실현한다


    예 1:
    from wsgiref.simple_server import make_server
    
    def f1():
        f1=open("index1.html","rb")
        data1=f1.read()
        return [data1]
    
    def f2():
        f2=open("index2.html","rb")
        data2=f2.read()
        return [data2]
    
    def application(environ, start_response):
    
        print(environ['PATH_INFO'])
        path=environ['PATH_INFO']
        start_response('200 OK', [('Content-Type', 'text/html')])
    
    
        if path=="/yuan":
            return f1()
    
        elif path=="/alex":
            return f2()
    
        else:
            return ["

    404

    ".encode("utf8")] httpd = make_server('', 8502, application) print('Serving HTTP on port 8084...') # HTTP : httpd.serve_forever()

    예 2:
    from wsgiref.simple_server import make_server
    
    
    def f1(req):
        print(req)
        print(req["QUERY_STRING"])
    
        f1=open("index1.html","rb")
        data1=f1.read()
        return [data1]
    
    def f2(req):
    
        f2=open("index2.html","rb")
        data2=f2.read()
        return [data2]
    
    import time
    
    def f3(req):        # 
    
        f3=open("index3.html","rb")
        data3=f3.read()
        times=time.strftime("%Y-%m-%d %X", time.localtime())
        data3=str(data3,"utf8").replace("!time!",str(times))
    
    
        return [data3.encode("utf8")]
    
    
    def routers():
    
        urlpatterns = (
            ('/yuan',f1),
            ('/alex',f2),
            ("/cur_time",f3)
        )
        return urlpatterns
    
    
    def application(environ, start_response):
    
        print(environ['PATH_INFO'])
        path=environ['PATH_INFO']
        start_response('200 OK', [('Content-Type', 'text/html')])
    
    
        urlpatterns = routers()
        func = None
        for item in urlpatterns:
            if item[0] == path:
                func = item[1]
                break
        if func:
            return func(environ)
        else:
            return ["

    404

    ".encode("utf8")] httpd = make_server('', 8518, application) print('Serving HTTP on port 8084...') # HTTP : httpd.serve_forever()

    좋은 웹페이지 즐겨찾기