Google App Engine에서 상대 경로를 찾는 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/61894

  •  09-06-2019
  •  | 
  •  

문제

그래서 저는 GAE를 사용하여 사소한 "준비" 앱을 수행했습니다.이제 좀 더 복잡한 디렉토리 구조를 가진 무언가를 만들고 싶습니다.다음과 같은 내용이 있습니다.

siteroot/
    models/
    controllers/
        controller1/
        controller2/
        ...
    templates/
        template1/
        template2/
        ...

..등.컨트롤러는 요청을 처리하는 Python 모듈입니다.그런 다음 관련 폴더에서 (Django 스타일) 템플릿을 찾아야 합니다.내가 본 대부분의 데모 앱은 다음과 같은 템플릿 경로를 해결합니다.

path = os.path.join(os.path.dirname(__file__), 'myPage.html')

...__ file __ 속성은 현재 실행 중인 스크립트로 확인됩니다.따라서 위의 예에서 Python 스크립트가 Controllers/controller1/에서 실행 중인 경우 'myPage.html'은 동일한 디렉터리(controllers/controller1/myPage.html)로 해석되며 내 페이지를 깔끔하게 분리하는 것이 좋습니다. Python 코드 및 템플릿.

제가 함께 해킹한 솔루션은 다음과 같습니다.해키:

base_paths = os.path.split(os.path.dirname(__file__))
template_dir = os.path.join(base_paths[0], "templates")

따라서 현재 실행 중인 스크립트에 대한 경로의 마지막 요소를 잘라내고 템플릿 디렉터리를 새 경로에 추가합니다.Python 경로를 해결하기 위해 내가 본 다른(GAE가 아닌) 솔루션은 꽤 무거워 보입니다(예: 경로를 목록으로 분할하고 그에 따라 조작하는 것).Django는 이에 대한 답을 갖고 있는 것 같지만 저는 GAE API를 고수하는 편이 낫습니다.전체 Django 앱을 만들고 GAE용으로 수정합니다.

앱이 Google의 무한한 서버 팜에 있기 때문에 하드 코딩된 모든 것이 시작되지 않을 것이라고 가정합니다.그렇다면 더 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

Toni가 제안한 것처럼 상대 경로를 사용할 수 없습니다. 작업 디렉터리에서 앱 디렉터리까지의 경로가 동일하게 유지된다는 보장이 없기 때문입니다.

올바른 해결책은 os.path.split을 그대로 사용하거나 다음과 같은 것을 사용하는 것입니다.

path = os.path.join(os.path.dirname(__file__), '..', 'templates', 'myPage.html')

나의 일반적인 접근 방식은 위의 방법을 사용하여 템플릿 디렉터리에 대한 경로를 생성하고 이를 내 컨트롤러 개체의 멤버로 저장한 다음 제공된 파일 이름을 가져와 기본 이름과 결합하는 "getTemplatePath" 메서드를 제공하는 것입니다.

다른 팁

그만큼 dirname 함수는 절대 경로를 반환하므로 상대 경로를 사용합니다.컨트롤러가 실행될 때 현재 디렉토리가 무엇인지 확인하십시오. os.path.abspath(os.path.curdir) 해당 위치를 기준으로 템플릿에 대한 경로를 구축합니다( os.path.abspath 물론 일부).

현재 디렉토리가 내부 어딘가에 있는 경우에만 작동합니다. 사이트루트, 그렇지 않으면 다음과 같이 할 수 있습니다:

template_dir = os.path.join(os.path.dirname(__file__), os.path.pardir, "templates")
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top