关于django:使用python在GAE中读取文件

Reading files in GAE using python

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

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

如果我让django模板系统为我读取相同的文件,一切都会正常工作!

所以问题是我做错了什么,而姜戈不是????使用相同的"pageurl"。

下面的代码将给出错误,而如果我对第一个页面内容分配进行注释,则一切正常。

代码:

1
2
3
4
5
6
7
8
9
        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"
                           }

错误:

1
2
3
4
5
6
7
8
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:

1
2
3
4
5
6
7
8
9
10
11
12
handlers:
- url: /javascript
  static_dir: javascript

- url: /images
  static_dir: images

- url: /portfolio
  static_dir: portfolio

- url: /.*
  script: main.py


"content-includes"上的os.path.normpath()是一个"no-op-normpath",它只删除了双斜杠和其他非规范化。您可能需要建立一个与脚本相关的路径,在这种情况下,您应该做一些类似于os.path.join(os.path.dirname(__file__), 'content_includes', pageName + '.inc')的事情。


如果你在dev-appserver.py源代码和相关文件中挖掘,你会发现服务器会做一些具体的检查,以确保你只打开来自应用程序根目录下的文件(事实上,规则看起来更复杂)。

对于出现问题的文件访问,我从开发服务器中检测到"路径权限检查"代码,以发现我使用的是绝对路径。我们应该做一个补丁来提供更好的错误报告:iirc AppServer不显示有问题的路径,但是它的一个错误版本使得调试变得困难。