2010-10-17 82 views
2

我創建了一個簡單的python項目,它提供了幾個頁面。我正在使用'webapp'框架和django。我想要做的是使用一個模板文件,並加載包含實際頁面文本的「內容文件」。使用python在GAE中讀取文件

當我嘗試使用os.open內容文件的讀取,我得到以下錯誤: pageContent = os.open(PAGEURL, 'R')閱讀() OSERROR:[錯誤1]不允許操作:'content_includes/home.inc'error

如果我讓django模板系統爲我讀取同一個文件,一切正常!

所以問題是我做錯了什麼,Django不是?使用相同的'pageUrl'。

下面的代碼會給我錯誤,而如果我註釋掉第一個pageContent賦值,一切正常。

代碼:

 
     pageName = "home"; 

     pageUrl = os.path.join(os.path.normpath('content_includes'), pageName + '.inc') 
     pageContent = os.open(pageUrl, 'r').read() 
     pageContent=template.render(pageUrl, template_values, debug=True); 

     template_values = { 'page': pageContent, 
          'test': "testing my app" 
          } 

錯誤:

 
Traceback (most recent call last): 
    File "/opt/apis/google_appengine/google/appengine/ext/webapp/__init__.py", line 511, in __call__ 
    handler.get(*groups) 
    File "/home/odessit/Development/Python/Alpha/main.py", line 19, in get 
    pageContent = os.open(pageUrl, 'r').read() 
    File "/opt/apis/google_appengine/google/appengine/tools/dev_appserver.py", line 805, in FakeOpen 
    raise OSError(errno.EPERM, "Operation not permitted", filename) 
OSError: [Errno 1] Operation not permitted: 'content_includes/home.inc' 

的app.yaml:

 
handlers: 
- url: /javascript 
    static_dir: javascript 

- url: /images 
    static_dir: images 

- url: /portfolio 
    static_dir: portfolio 

- url: /.* 
    script: main.py 
+0

btw,template_values已在pageName賦值之前聲明 – Vladimir 2010-10-17 22:27:37

+1

這是您的實際代碼?因爲您在嘗試讀取變量時正在爲您的變量分配渲染模板,並且您有一個以分號結束的行。 – geoffspear 2010-10-17 23:17:59

+0

兩件事:1.它不是我的實際代碼,它是它的一個片段(我剪掉了一堆東西,並用其他東西代替它們),對於template_values,它在pageName上面聲明,因爲我沒有在第一次渲染期間需要做任何替換,第二次渲染正好在template_values聲明的下面。 2.我喜歡分號 - 我是一名Java開發人員:) – Vladimir 2010-10-19 00:14:47

回答

2

os.path.normpath()的 「content_includes」 是一個無操作 - normpath只是刪除雙斜線和其他反規範化。你可能想要的是建立一個相對於腳本的路徑,在這種情況下你應該做一些類似於os.path.join(os.path.dirname(__file__), 'content_includes', pageName + '.inc')的事情。

0

如果您深入瞭解dev_appserver.py源代碼和相關文件,您會發現服務器會進行一些肉眼檢查以確保僅打開應用程序根目錄下的文件(實際上規則看起來更復雜)。

對於文件訪問困難,我檢測到來自開發服務器的「路徑權限檢查」代碼,發現我使用的是絕對路徑。我們可能應該爲appengine做一個補丁,以提供更好的錯誤報告:IIRC Appserver不會顯示違規路徑,但是這會使得調試變得困難。