2010-10-17 180 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不会显示违规路径,但是这会使得调试变得困难。