在GAE中使用Python读取文件

2 投票
2 回答
630 浏览
提问于 2025-04-16 05:39

我创建了一个简单的Python项目,用来展示几个页面。我使用的是'webapp'框架和Django。我想做的是使用一个模板文件,然后加载一些包含实际页面文本的'内容文件'。

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

但是如果让我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

2 个回答

0

如果你深入研究一下dev_appserver.py的源代码和相关文件,你会发现服务器会进行一些检查,以确保你只能打开应用程序根目录下的文件(实际上,这些规则似乎还更复杂)。

为了处理文件访问的问题,我对开发服务器中的“路径权限检查”代码进行了修改,发现我使用的是绝对路径。我们可能应该对appengine做个修补,以提供更好的错误报告:我记得Appserver并不会显示出问题的路径,而是一个混乱的版本,这让调试变得很困难。

2

os.path.normpath() 在 "content_includes" 上其实没有什么作用 - 它只是去掉了路径中的重复斜杠和其他不规范的部分。如果你想要的是构建一个相对于脚本的路径,那么你应该这样做:os.path.join(os.path.dirname(__file__), 'content_includes', pageName + '.inc')

撰写回答