2009-04-28 2 views
1

mod_python과 Apache를 처음 사용하고 GET 요청 후 파일을 사용자에게 반환하는 데 문제가 있습니다. 지금은 아주 간단한 설정을 가지고, 단순히 파일을 열고 응답에 기록하는 기대했다 : 말,mod_python에서 어떻게 파일 시스템을 열고 전송합니까?

from mod_python import apache 

def handler(req): 
    req.content_type = 'application/octet-stream' 
    fIn = open('response.bin', 'rb') 
    req.write(fIn.read()) 
    fIn.close() 
    return apache.OK 

는 그러나, 나는 오류를 받고 있어요 나는 (오픈 사용) 그 파일은 존재하지 않습니다 (비록 내가 12 번 체크 했더라도). 이것은 상대적 및 절대 파일 경로를 사용할 때 발생합니다.

  • 왜 열려 있지 않은() 파일을 권리를 찾는 :

    나는 두 가지 질문이 있어요?

  • 파일 시스템에서 파일을 반환하는 가장 좋은 방법은 무엇입니까? (내가 파일을 반환하여 mod_python을 사용하는 몇 가지 좋은 방법 누락 아니에요 이 있는지 확인 부탁드립니다.)

감사

편집 : 나는 열려있는 것을 발견 http://www.programmingforums.org/thread12384.html() :이 스레드를 찾은 후 내가 home/home/myname/httpdocs에서 별명을 지정하지 않고 다른 디렉토리로 파일을 이동하면 나를 위해 작동하지만/data를 사용하면 작동합니다. 왜 그런 아이디어가 있니?

편집 2 : 내 디버그 오류의 일부의 요청에 따라 :

MOD_PYTHON ERROR 

ProcessId:  13642 
Interpreter: '127.0.1.1' 

ServerName:  '127.0.1.1' 
DocumentRoot: '/var/www' 

URI:   '/test/mptest.py' 
Location:  None 
Directory:  '/home/myname/httpdocs/' 
Filename:  '/home/myname/httpdocs/mptest.py' 
PathInfo:  '' 

Phase:   'PythonHandler' 
Handler:  'mptest' 

Traceback (most recent call last): 

    File "/usr/lib/python2.5/site-packages/mod_python/importer.py", line 1537, in HandlerDispatch 
    default=default_handler, arg=req, silent=hlist.silent) 

    File "/usr/lib/python2.5/site-packages/mod_python/importer.py", line 1229, in _process_target 
    result = _execute_target(config, req, object, arg) 

    File "/usr/lib/python2.5/site-packages/mod_python/importer.py", line 1128, in _execute_target 
    result = object(arg) 

    File "/home/myname/httpdocs/mptest.py", line 13, in handler 
    fIn = open('/home/myname/httpdocs/files/response.bin', 'rb') 

IOError: [Errno 2] No such file or directory: '/home/myname/httpdocs/files/response.bin' 

답변

4

는 이런 종류의 일을 디버깅하려면, 당신은 실행중인 mod_python의 인스턴스에서 모든 정보를 수집해야합니다.

"존재하는 12 번 확인"으로 어지럽히 지 말라. 일부 가정은 올바르지 않습니다.

디버깅 정보를 얻으려면 다음과 같이하십시오. 편집

def handler(req): 
    req.content_type = 'text/plain' 
    req.write(os.environ) 
    req.write(os.getcwd()) 
    # etc. 
    return apache.OK 

은 이제 중요 물건을 엿볼 수있다. 이 경우 권한이있을 수 있습니다. os.filestat를 사용해야합니다. 아파치는 mod_python을 사용 권한이 거의없는 사용자로 실행합니다. 아파치는 링크를 좋아하지 않지만 mod_python에는 영향을주지 않습니다. 파일이 모두 읽기 전용 디렉토리가 아니고 올바른 디렉토리에없는 경우 문제가 발생합니다.

mod_wsgi으로 전환 할 수 있습니다.

+0

무슨 일이 일어나는지에 대한 단서를 찾은 후에 제 질문을 업데이트했습니다. 또한 귀하의 조언을 시도하고 몇 가지 흥미로운 사실을 발견 : mod_python은 "www- 데이터"로 실행하고 "/"밖으로 실행됩니다. –

0

오류를 붙여 넣으 실 수 있습니까?

권한 오류 일 수 있습니다 (파일의 전체 경로를 사용해 본 경우). 스크립트는 웹 서버 프로세스를 실행하는 사용자로 실행되므로 일반적으로 파일을 "www-data"또는 "nobody"로 액세스하게됩니다.

/home/myname/httpdocs/files/ 폴더의 사용 권한도 확인하십시오.폴더는 www-data 사용자 +x을해야한다 :

$ mkdir blah 
$ echo works > blah/response.bin 
$ chmod 000 blah/ 
$ cat blah/response.bin 
cat: blah/response.bin: Permission denied 
$ chmod +x blah/ 
$ cat blah/response.bin 
works 
당신은 수행하여 식 아파치/당신의 스크립트를 제거 할 수

다음 :

you:~$ sudo su - www-data 
www-data:~$ file /home/myname/httpdocs/files/response.bin 

합니다 (스와에 따라 작동하지 않을 것 사용중인 OS/배포판, 예를 들어 OS X에서 사용자가 로그인하지 못하도록합니다.

파일 권한은 제외하고 파일이 홈 폴더에있는 파일에 의존하는 이유는 무엇입니까? response.bin을 파이썬 스크립트와 같은 폴더로 옮길 수 있습니까? 또는 심지어 데이터베이스로 이동? (아마도 SQLite? response.bin에 무엇이 있는지에 따라 불필요하거나 과도 할 수도 있습니다.)

+1

나는 내 질문에 대부분의 오류를 붙여 넣었습니다. 그러나, 나는 성공적으로 www 데이터에 파일 chowning 시도했다. (어쩌면 나는 유닉스 OS 권한을 오해하고있다.) –

관련 문제