[python] 단순 HTTP 서버에서 액세스 제어 사용

매우 간단한 HTTP 서버에 대한 다음 셸 스크립트가 있습니다.

#!/bin/sh

echo "Serving at http://localhost:3000"
python -m SimpleHTTPServer 3000

이 서버 와 같은 CORS 헤더를 어떻게 활성화하거나 추가 할 수 있는지 궁금 Access-Control-Allow-Origin: *합니다.



답변

안타깝게도 간단한 HTTP 서버는 특히 보내는 헤더가 아닌 사용자 정의를 허용하지 않을 정도로 간단합니다. 그러나 대부분의을 사용하여 간단한 HTTP 서버를 직접 만들고 SimpleHTTPRequestHandler원하는 헤더를 추가 할 수 있습니다.

이를 위해 파일 simple-cors-http-server.py(또는 기타)을 만들고 사용중인 Python 버전에 따라 다음 코드 중 하나를 내부에 넣으십시오.

그런 다음 할 수 있으며 python simple-cors-http-server.py모든 응답에 대해 CORS 헤더를 설정하는 수정 된 서버를 시작합니다.

으로 오두막 상단의 파일을 실행하고 사용자의 PATH에 넣어, 당신은 단지 사용하여 실행할 수 있습니다 simple-cors-http-server.py도.

Python 3 솔루션

파이썬 3 사용 SimpleHTTPRequestHandler하고 HTTPServer로부터 http.server모듈은 서버를 실행합니다 :

#!/usr/bin/env python3
from http.server import HTTPServer, SimpleHTTPRequestHandler, test
import sys

class CORSRequestHandler (SimpleHTTPRequestHandler):
    def end_headers (self):
        self.send_header('Access-Control-Allow-Origin', '*')
        SimpleHTTPRequestHandler.end_headers(self)

if __name__ == '__main__':
    test(CORSRequestHandler, HTTPServer, port=int(sys.argv[1]) if len(sys.argv) > 1 else 8000)

Python 2 솔루션

Python 2는 SimpleHTTPServer.SimpleHTTPRequestHandlerBaseHTTPServer모듈 을 사용 하여 서버를 실행합니다.

#!/usr/bin/env python2
from SimpleHTTPServer import SimpleHTTPRequestHandler
import BaseHTTPServer

class CORSRequestHandler (SimpleHTTPRequestHandler):
    def end_headers (self):
        self.send_header('Access-Control-Allow-Origin', '*')
        SimpleHTTPRequestHandler.end_headers(self)

if __name__ == '__main__':
    BaseHTTPServer.test(CORSRequestHandler, BaseHTTPServer.HTTPServer)

Python 2 및 3 솔루션

Python 3과 Python 2 모두에 대한 호환성이 필요한 경우 두 버전 모두에서 작동하는이 polyglot 스크립트를 사용할 수 있습니다. 먼저 Python 3 위치에서 가져 오기를 시도하고 그렇지 않으면 Python 2로 폴백합니다.

#!/usr/bin/env python
try:
    # Python 3
    from http.server import HTTPServer, SimpleHTTPRequestHandler, test as test_orig
    import sys
    def test (*args):
        test_orig(*args, port=int(sys.argv[1]) if len(sys.argv) > 1 else 8000)
except ImportError: # Python 2
    from BaseHTTPServer import HTTPServer, test
    from SimpleHTTPServer import SimpleHTTPRequestHandler

class CORSRequestHandler (SimpleHTTPRequestHandler):
    def end_headers (self):
        self.send_header('Access-Control-Allow-Origin', '*')
        SimpleHTTPRequestHandler.end_headers(self)

if __name__ == '__main__':
    test(CORSRequestHandler, HTTPServer)


답변

http-server와 같은 대안을 시도하십시오.

SimpleHTTPServer는 실제로 프로덕션에 배포하는 종류의 서버가 아니기 때문에 http://localhost:3000CORS 헤더로 파일을 간단하게 노출하는 작업을 수행하는 한 사용하는 도구에 대해별로 신경 쓰지 않는다고 가정 합니다. 명령 줄

# install (it requires nodejs/npm)
npm install http-server -g

#run
http-server -p 3000 --cors

HTTPS가 필요하십니까?

로컬에서 https가 필요한 경우 캐디 또는 certbot을


유용 할 수있는 관련 도구

  • ngrok : 실행할 때 누구나 액세스 할 수 ngrok http 3000있는 URL https://$random.ngrok.com을 생성 합니다.http://localhost:3000 서버 합니다. 컴퓨터에서 로컬로 실행되는 항목 (로컬 백엔드 / api 포함)을 세상에 노출 할 수 있습니다.

  • 지역 터널 : 와 거의 동일

  • now : 실행할 때 now정적 자산을 온라인으로 업로드하고 https://$random.now.sh. 달리 결정하지 않는 한 영원히 온라인 상태로 유지됩니다. diffing 덕분에 배포가 빠릅니다 (첫 번째 제외). 이제 프로덕션 프런트 엔드 / SPA 코드 배포에 적합합니다. Docker 및 NodeJS 앱도 배포 할 수 있습니다. 실제로 무료는 아니지만 무료 계획이 있습니다.


답변

나는 같은 문제가 있었고이 해결책을 찾았습니다.

class Handler(SimpleHTTPRequestHandler):
    def send_response(self, *args, **kwargs):
        SimpleHTTPRequestHandler.send_response(self, *args, **kwargs)
        self.send_header('Access-Control-Allow-Origin', '*')

send_response메서드 만 변경하는 SimpleHTTPRequestHandler에서 상속 된 새 클래스를 만들었습니다 .


답변

do_GET ()의 고유 한 인스턴스를 제공해야합니다 (그리고 HEAD 작업을 지원하도록 선택한 경우 do_HEAD ()). 이 같은:

class MyHTTPServer(SimpleHTTPServer):

    allowed_hosts = (('127.0.0.1', 80),)

    def do_GET(self):
        if self.client_address not in allowed_hosts:
            self.send_response(401, 'request not allowed')
        else:
            super(MyHTTPServer, self).do_Get()


답변