2012-05-31 4 views
0

Apache mod_wsgi는 Apache와 함께 실행되고 CGI 요청을 처리하는 Python 인터프리터를 구현하지만 WSGI와 CGI의 차이점은 WSGI를 사용하면 Apache 서버가 실행되는 동안 Python 세션이 계속 실행된다는 것입니다. CGI 서버가 CGI 요청을받을 때마다 다시 시작해야합니다.Apache에서 WSGI 요청을 수신하는 Python 모듈?

제가 알고 싶습니다. 대화식 Python 세션과 같이 Apache에서 CGI 요청을 수신 대기하는 Python 모듈이 있습니까? 따라서 예를 들어 아파치가 실행 중이고 WSGI 미들웨어가 실행되지 않으면 인터랙티브 한 파이썬 세션을 시작하고 WSGI 미들웨어 모듈을 임포트 한 다음 아파치의 CGI 요청을 처리 할 수있다. 아파치 셧다운. 따라서 Apache mod_wsgi와 같은 단일 세션이지만 Apache와 항상 동시에 실행될 필요는 없으며 대화식 Python 세션에서 실행할 수 있습니다.

편집 1 :

그래서 예를 들면, 나는 myapp.py이 플라스크 응용 프로그램이 있습니다

from flask import Flask 

app = Flask(__name__) 
app.debug = True 

app.apples = 0 

@app.route('/') 
def hello(): 
    app.apples += 1 
    return 'blah: %d' % app.apples 

if __name__ == '__main__': 
    app.run(host='0.0.0.0', port=8080) 

을 그리고 파이썬 myapp.py을 입력하여 실행할 수 있지만, 자신의 웹을 시작합니다 섬기는 사람. 대신 아파치를 웹 서버로 만들고 싶습니다만, 대화 형 파이썬 셸을 열어 from myapp import *을 입력하고 응용 프로그램에서 Apache의 요청을 수신하도록하고 싶습니다. 대화 형 셸이 있기 때문에 할 수 있습니다. 예 : print app.apples 또는 app.apples = 50 또는 기타 내 웹 응용 프로그램을 웹 서버와 분리하여 파이썬 셸과 대화식으로 만들길 원합니다.

app.apples과 같은 말은 숫자가 '/' 인 횟수에 대한 적중 횟수와 같은 전역 변수이며 앱이 실행되는 동안 지속됩니다.

편집 2 :

다른 예가 있습니다.

myapp.py : 여기

import web 

def add_global_hook(): 
    g = web.storage({"counter": 0}) 
    def _wrapper(handler): 
     web.ctx.globals = g 
     return handler() 
    return _wrapper 

class Hello: 
    def GET(self): 
     web.ctx.globals.counter += 1 
     return "<h1>Counter: %d</h1>" % web.ctx.globals.counter 

urls = ("/", "Hello") 
app = web.application(urls, globals()) 
app.add_processor(add_global_hook()) 
app.run() 

, 나는 파이썬 인터프리터를 열고 from myapp import *을 입력하고, 웹 서버를 시작하지만, 웹 서버가 실행되는 동안, 나는 상호 작용을 사용하여 차단하고있어 수 껍질. 대화 형 셸을 사용할 수 있도록 서버를 비 차단 방식으로 실행하는 방법이 있습니까?

+0

그것은 도움이 될 것이다 - 아마도 그 좋은 아이디어를 자극한다. – gahooa

+0

문제가 발생하면 apache + wsgi 설정을 디버깅하는 데 유용 할 수 있습니다. 또한 wsgi 응용 프로그램 디버깅 및 wsgi에 대한 repl 제공에 대한 일반적인 사용법을 볼 수 있습니다. – jhonkola

+0

그래, 디버깅을하고 싶습니다. 아파치를 대화식 세션과 별도로 실행 시키길 원합니다. 아파치를 따로 닫을 수는 있지만 여전히 대화식 세션이 있습니다. 그래서 수정할 수 있습니다. 아파치 백업을 시작하십시오. –

답변

2

Apache를 프런트 엔드 프록시로 사용하는 gunicorn WSGI 서버를 사용하고 계십니까?

https://github.com/GrahamDumpleton/wsgi-shell

당신은 당신이 내 mod_wsgi에 데몬 모드를 사용할 수 있는지 확인하려면 단지 것입니다 : 당신이 너무 복잡 아무것도 할 필요없이 라이브 파이썬 웹 응용 프로그램을 디버깅 할 수있는 능력 후에 경우

도보고 mod_wsgi를 사용할 경우 단일 데몬 프로세스의 기본값.

사실, mod_wsgi가 어떻게 작동하는지에 대한 이해는 약간 잘못이지만, 시도하려는 것을 왜하고 싶은지 더 쉽게 설명하는 데 도움이됩니다. 아마 당신의 인식 된 해결책보다는 실제적인 문제를 제시함으로써 시작하십시오.

+0

조금 더 자세하게 질문을 편집했습니다. –

+0

문제는 다음과 같습니다. 웹 서버와 웹 응용 프로그램을 별도로 만들고 파이썬 셸과 상호 작용하는 방법은 무엇입니까? –

+0

BTW wsgi-shell을 사용해 보았습니다. 그러나 임베디드 파이썬 콘솔이 내 응용 프로그램의 변수에 액세스하지 못하는 것 같습니다. 예를 들어, 임베디드 콘솔에서'print app.apples'를 시도했는데 'app'이 정의되어 있지 않다는 것을 알려 주므로 임베디드 콘솔의 목적을 오해하고 있습니다. –

0

특정 DLL이 Windows + Apache 2.2 + mod_wsgi에서로드되지 않는 이유를 파악하는 데 문제가 있으므로 동일한 질문을 고려하고 있습니다. (필자의 경우 Python의 Shapely 라이브러리가 "geos_c.dll"을로드하려고 할 때 문제가 발생합니다.)

해결 방법은 모든 포트에서 올바르게 작동하는 독립 실행 형 WSGI 응용 프로그램을 실행하는 것입니다. 해당 포트에 직접 요청하십시오. 그때, 같은과, 프록시에 해당 포트를 아파치를 구성합니다

당신에 대해 걱정이 몇 가지 있습니다
ProxyPass /wsgi/myapp http://127.0.0.1:81 
ProxyPassReverse /wsgi/myapp http://127.0.0.1:81 

: 내장 WSGI 서버하는 다중 스레드되지

  • (그래서 당신은 던졌다 멀리 아파치 뒤에 WSGI를 사용하여 큰 장점 중 하나)
  • 독립 실행 형 Python WSGI 서버를 콘솔에서 실행해야합니다. 실수로 닫으면 응용 프로그램이 종료되므로 Apache WSGI의 또 다른 이점이 없어집니다. 콘솔 없음 및 아무도 로그인하지 않은 서비스)
0

파이썬은 wsgiref 모듈에 wsgi 서버가 내장되어 있으며, 실제 사용에는 적합하지 않지만 개발 및 테스트 용도로 적합합니다. 예를 들어,도 제공 예를 들어 WSGI 응용 프로그램을 사용하여 : 편집 그리고 당신이 원하는 이유를 설명 할 수 있다면

>>> import wsgiref.simple_server 
>>> server = wsgiref.simple_server.make_server('0.0.0.0', 8888, wsgiref.simple_server.demo_app) 
>>> server.serve_forever() 
127.0.0.1 - - [21/Jul/2016 00:44:04] "GET/HTTP/1.1" 200 2664 
127.0.0.1 - - [21/Jul/2016 00:44:05] "GET /favicon.ico HTTP/1.1" 200 2615 
127.0.0.1 - - [21/Jul/2016 00:44:05] "GET /favicon.ico HTTP/1.1" 200 2675 
^CTraceback (most recent call last): 
    File "<ipython-input-5-30934a6743d8>", line 1, in <module> 
    server.serve_forever() 
    File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 236, in serve_forever 
    poll_interval) 
    File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 155, in _eintr_retry 
    return func(*args) 
KeyboardInterrupt 

>>> 
관련 문제