복붙노트

[PYTHON] 1 & 1 공유 호스팅에 플라스크 애플리케이션 배포 (CGI 사용)

PYTHON

1 & 1 공유 호스팅에 플라스크 애플리케이션 배포 (CGI 사용)

플라스크 웹 프레임 워크를 사용하여 스포츠 클럽 용 웹 응용 프로그램을 작성했습니다. 빌드 테스트 (build-in) 테스트 서버를 사용하여 로컬 컴퓨터에서 모든 작업을 수행했습니다.

그들은 1 & 1 공유 호스팅 웹 공간에 배포하도록 지시했는지 알고 있습니다. 그들은 파이썬 지원을 가지고 있지만 CGI가 파이썬 스크립트 만 실행할 수있는 것처럼 보입니다.

나는이 튜토리얼을 시도했다 : CGI를 통한 플라스크

지금까지 재 작성 내용을 무시했습니다. CGI 스크립트에 대한 모든 요청으로 인해 404 오류가 발생했습니다. request.path를 반환하도록 응용 프로그램에서 404 처리기를 수정했습니다. /foo/runserver.cgi/을 요청하면 /가 출력으로 반환됩니다. 왜 그것이 인덱스보기를 제공하지 않는지 나는 모른다. 어떤보기와도 작동하지 않으며, 나는 항상 404를 얻습니다.

친절하고, 세바스찬

해결법

  1. ==============================

    1.나는 주어진 답이 불완전하고 / $ 1을 버리기위한 제안이 잘못 되었기 때문에 거의 1 년 후에 답을 제공하고자합니다. "cgi에서 deploy flask"문자열을 사용하여 인터넷 검색에서 도달 할 수있는 다른 stackoverflow 스레드도 만족스러운 솔루션없이 종료되었습니다.

    나는 주어진 답이 불완전하고 / $ 1을 버리기위한 제안이 잘못 되었기 때문에 거의 1 년 후에 답을 제공하고자합니다. "cgi에서 deploy flask"문자열을 사용하여 인터넷 검색에서 도달 할 수있는 다른 stackoverflow 스레드도 만족스러운 솔루션없이 종료되었습니다.

    먼저 .htaccess 파일은 .htaccess에서 주석이 전체 행을 차지해야하기 때문에 RewriteCond에 대한 두 번째 행의 주석을 제거해야한다는 점을 제외하고는 참조 된 "CGI를 통한 플라스크"문서와 정확히 같습니다.

    .htaccess 파일을 public_html 문서 루트 폴더에 넣고 cgi 스크립트는 /home/myusername/public_html/scgi-bin/moc/cgiappserver-prod.cgi입니다.

    물론 파이썬이고 꼭대기에있는 이방인이 더 옳다. 내 ISP에서 그들은 "scgi"라고 부르는 CGI 래퍼를 가진 cpanel을 사용합니다. 불행히도 그것은 진짜가 아닙니다. 따라서 Flask를 실행하기 위해 일반 CGI로 취급하십시오.

    나는 공유 호스팅 계정 만 있다고 덧붙여 야합니다.

    다음은 내 cgiappserver-prod.cgi 파일입니다.

    #!/home/myusername/local/bin/python
    import cgitb; cgitb.enable()  # This line enables CGI error reporting
    from wsgiref.handlers import CGIHandler
    import traceback
    from settings import LGGR
    
    app = None
    try:
        import moc
        app = moc.app
    except Exception, e:
        LGGR.info( traceback.format_exc([10]) )
        LGGR.info( 'Problem in cgiappserver-prod with moc import: %s' % e )
    
    class ScriptNameStripper(object):
       def __init__(self, app):
           self.app = app
       def __call__(self, environ, start_response):
           environ['SCRIPT_NAME'] = ''
           return self.app(environ, start_response)
    
    app = ScriptNameStripper(app)
    
    try:
        CGIHandler().run(app)
    except Exception, e:
        LGGR.info( traceback.format_exc([10]) )
        LGGR.info( 'Problem in cgiappserver-prod with CGIHandler().run(): %s' % e )
    

    그래서 내 app은 몇 파일에 퍼져있다. 특히 set.py와 moc.py는 위의 코드에서 보여진다.

    창업의 시간은 제가 읽은이 주제에 대한 도움이되지 않는 게시물 덕분이었습니다.하지만 주로 오류 메시지를 일찌감치 꺼내는 일을하지 못해서였습니다. (ISP에서 제공하는 오류 로그에 액세스 할 수 있지만 거의 도움이되지 않습니다.)

    먼저 cgitb.enable () 함수가 작동하는지 확인했습니다. 고의적으로 wsgiref의 철자를 틀 었으며 아름다운 오류 페이지를 보았고 cgitb (cgi traceback) 행을 주석 처리하여 오류 메시지가 쓸모없는 500 상태 코드로 바뀌는 것을 보았습니다.

    나 또한 settings.py에서 로거, 회전 파일 로거 LGGR을 설정한다는 점에 유의하십시오. 그걸로 나는 여기에 표시되지 않은 뭔가를 추가로해야한다는 것을 발견했습니다. 파이썬 인터프리터에게 sqlite3 라이브러리가 어디에 있는지 알려주는 것입니다.

    또한 단순히 CGI에서 언급 된 Flask 문서가 말한 print 문을 사용할 수 있습니다.

    사실이지만 HTTP 응답에 대한 인쇄물 쓰기를 디버깅하는 동안 도움이됩니다.

    마침내 브라우저의 위치 상자에 슬픈 듯이 www.mysite.com/scgi-bin/moc/cgiappserver-prod.cgi/contact가있는 반면, 실제로는 간단히 www.mysite.com이 필요했습니다. /접촉.

    치료법은 cgiappserver-prod.cgi의 ScriptNameStripper 클래스입니다. 다른 플라스크 워드 프로세서에서 가져 왔어.

  2. ==============================

    2.해결책을 찾았습니다! CGI의 환경 변수가 WSGI 응용 프로그램에서 약간 다른 이름을 갖기 때문에 나는 $ .htaccess에서 / $ 1을 (를) 멀리두고 변경된 werkzeug를 약간 수정했습니다. 나는 그것에 대해 werkzeug 개발자에게 알려주고 아마도 그는 내 솔루션을 werkzeug에 포함시킬 것이다.

    해결책을 찾았습니다! CGI의 환경 변수가 WSGI 응용 프로그램에서 약간 다른 이름을 갖기 때문에 나는 $ .htaccess에서 / $ 1을 (를) 멀리두고 변경된 werkzeug를 약간 수정했습니다. 나는 그것에 대해 werkzeug 개발자에게 알려주고 아마도 그는 내 솔루션을 werkzeug에 포함시킬 것이다.

  3. ==============================

    3.나는 내가 한 일을 보여 주려고 노력할 것이고, 호스트 계정을 공유하는 Godaddy에서 일하고있다.

    나는 내가 한 일을 보여 주려고 노력할 것이고, 호스트 계정을 공유하는 Godaddy에서 일하고있다.

    MYSITE 폴더의 cgi-bin 폴더에 다음 cgi 파일을 추가했습니다.

    #!/home/USERNAME/.local/bin/python3
    from wsgiref.handlers import CGIHandler
    
    from sys import path
    path.insert(0, '/home/USERNAME/public_html/MYSITE/')
    from __init__ import app
    
    class ProxyFix(object):
       def __init__(self, app):
           self.app = app
    
       def __call__(self, environ, start_response):
           environ['SERVER_NAME'] = ""
           environ['SERVER_PORT'] = "80"
           environ['REQUEST_METHOD'] = "GET"
           environ['SCRIPT_NAME'] = ""
           environ['PATH_INFO'] = "/"
           environ['QUERY_STRING'] = ""
           environ['SERVER_PROTOCOL'] = "HTTP/1.1"
           return self.app(environ, start_response)
    
    if __name__ == '__main__':
        app.wsgi_app = ProxyFix(app.wsgi_app)
        CGIHandler().run(app)
    

    MYSITE 폴더의 init 파일에는 플라스크 앱이 있습니다.

    가장 중요한 것은 권한을 올바르게 설정하는 것입니다. 755를 "/home/USERNAME/.local/bin/python3"폴더와 같이이 폴더 권한으로 설정했습니다 !! 플라스크 및 모든 파이썬 패키지를 열려면이 권한이 필요하다는 것을 기억하십시오.

    디버깅을 위해 ssh 터미널을 통해 사이트를 방문하고 CGI 만 실행하는 것이 좋습니다. 작동하지만 웹에서 그렇지 않으면 아마도 더 많은 사용 권한을 부여해야하거나 .htaccess 파일을 잘못 작성한 것일 수 있습니다.

    CGI를 열려면 MYSITE 폴더에 다음 .htaccess 파일이 있어야합니다.

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.*)$ /home/USERNAME/public_html/MYSITE/cgi-bin/application.cgi/$1 [L]
    

    누군가가 귀하의 페이지를 입력하면 cgi 파일을 렌더링합니다.

  4. from https://stackoverflow.com/questions/18259435/deploy-flask-application-on-11-shared-hosting-with-cgi by cc-by-sa and MIT license