使用python在GAE中读取文件

时间:2010-10-17 21:22:36

标签: python django google-app-engine

我创建了一个简单的python项目,可以提供几页。我正在使用'webapp'框架和django。我要做的是使用一个模板文件,并加载包含实际页面文本的“内容文件”。

当我尝试使用os.open读取内容文件时,出现以下错误: pageContent = os.open(pageUrl,'r')。read() OSError:[Errno 1]不允许操作:'content_includes / home.inc'错误

如果我让django模板系统为我读取同一个文件,一切正常!

所以问题是django不是我做错了什么?使用相同的'pageUrl'。

下面的代码会给我错误,而如果我注释掉第一页内容分配,一切正常。

代码:

        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

2 个答案:

答案 0 :(得分:2)

“content_includes”上的

os.path.normpath()是一个无操作 - normpath只删除双斜杠和其他非规范化。您可能想要的是构建相对于脚本的路径,在这种情况下,您应该执行类似os.path.join(os.path.dirname(__file__), 'content_includes', pageName + '.inc')的操作。

答案 1 :(得分:0)

如果您深入了解dev_appserver.py源代码和相关文件,您会看到服务器进行了一些化身检查,以确保您只打开应用程序根目录下的文件(实际上规则似乎更复杂)。

对于有问题的文件访问,我从开发服务器检测到“路径权限检查”代码,发现我正在使用绝对路径。我们可能应该做一个补丁来提供更好的错误报告:IIRC Appserver不会显示有问题的路径,而是一个错误的版本,这会使调试变得困难。