9

我一直在尝试了解 application_readable 静态 url 处理程序字段是如何工作的。我正在使用 SDK 1.7.7 版,并且在我的开发环境中的应用程序上将其设置为 true,但我似乎无法真正读取该文件:

# app.yaml

- url: /test
  static_dir: application/static/test
  application_readable: true

# app.py

path = os.path.join(os.path.split(__file__)[0], 'static/test/test.png')
self.response.out.write('Looking for %s...' % path)
self.response.out.write(os.path.exists(path))
self.response.out.write("\n")
path = '/application/static/test/test.png'
self.response.out.write('Looking for %s...' % path)
self.response.out.write(os.path.exists(path))
self.response.out.write("\n")
path = 'application/static/test/test.png'
self.response.out.write('Looking for %s...' % path)
self.response.out.write(os.path.exists(path))
self.response.out.write("\n")
path = '/static/test/test.png'
self.response.out.write('Looking for %s...' % path)
self.response.out.write(os.path.exists(path))
self.response.out.write("\n")
path = 'static/test/test.png'
self.response.out.write('Looking for %s...' % path)
self.response.out.write(os.path.exists(path))
self.response.out.write("\n")
path = '/test/test.png'
self.response.out.write('Looking for %s...' % path)
self.response.out.write(os.path.exists(path))
self.response.out.write("\n")
path = 'test/test.png'
self.response.out.write('Looking for %s...' % path)
self.response.out.write(os.path.exists(path))
self.response.out.write("\n")
path = '/test.png'
self.response.out.write('Looking for %s...' % path)
self.response.out.write(os.path.exists(path))
self.response.out.write("\n")
path = 'test.png'
self.response.out.write('Looking for %s...' % path)
self.response.out.write(os.path.exists(path))

但这些都不起作用:

Looking for /vagrant/test/application/static/test/test.png...False
Looking for /application/static/test/test.png...False
Looking for application/static/test/test.png...False
Looking for /static/test/test.png...False
Looking for static/test/test.png...False
Looking for /test/test.png...False
Looking for test/test.png...False
Looking for /test.png...False
Looking for test.png...False

虽然该文件肯定存在:

vagrant@precise64:/vagrant/kissyface$ ls -l /vagrant/test/application/static/test/test.png
-rwxrwxrwx 1 vagrant vagrant 9920 May  3 18:13 /vagrant/test/application/static/test/test.png

谁能告诉我我做错了什么?除了 statis url handler 文档中的简短描述和 appengine sdk 1.7.6 更改日志中的提及之外,我无法找到任何文档或示例代码。是否有提供对这些文件的访问的实用程序类,还是我完全误解了 application_readable 实际上应该做什么?

4

1 回答 1

17

概述

很难推断你的系统到底发生了什么,但我可以告诉你什么在我的系统上有效。我们可以整天猜测可能出了什么问题,但是实施一些可行的东西并向后工作通常比猜测更有效率;它可以是任何东西。

如果我猜的话,我会说问题是:

  1. 处理程序顺序不正确
  2. 搞砸了python路径
  3. 搞砸了python版本
  4. 使用 janky 旧 SDK
  5. 内裤侏儒

如果您实现了我在下面概述的项目,而不是猜测,那么向后推理并找出为什么它不适合您应该很简单。如果这个项目不工作,你有一些工作要做。这个问题真的很糟糕(我不想帮你解决它)。如果它确实有效,那么您很幸运,因为您距离让其余代码也正常工作还有 5 或 10 分钟!

使用来自http://code.google.com/p/googleappengine/downloads/list的最新 python appengine SDK :

google_appengine_1.8.0.zip
71b5f3ee06dce0a7d6af32d65ae27272eac038cb

项目文件及其内容:

目录设置:

.
├── app.py
├── app.pyc
├── app.yaml
└── static
    └── hi.txt

应用程序.py:

import webapp2
import os

class MainPage(webapp2.RequestHandler):
    def get(self):
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.out.write('Hello, webapp World!\n\n')

        path = os.path.join(os.path.split(__file__)[0], 'static/hi.txt')
        self.response.out.write(open(path).readlines()[0])

application = webapp2.WSGIApplication([('/.*', MainPage)])

app.pyc 是这个文件的(自动)编译版本。

应用程序.yaml:

application: myapp
version: 1
runtime: python27
api_version: 1
threadsafe: yes

handlers:
- url: /static
  static_dir: static
  application_readable: true
- url: /.*
  script: app.application

静态/hi.txt:

Ezra can see this text fine; I'm not sure why you can't... Hi!

怎么了:

从项目根目录启动网络服务器:

 dev_appserver.py --port 80 .

您可能必须使用不同的端口号;这没什么大不了的。只需根据您选择的说明调整以下说明。

http://localhost/在浏览器中访问:

Http响应:

INFO     2013-05-14 09:45:57,372 server.py:585] default: "GET / HTTP/1.1" 200 85

浏览器输出:

你好,网络应用世界!

以斯拉可以很好地看到这段文字;我不知道你为什么不能......嗨!

http://localhost/static/hi.txt在浏览器中访问:

Http响应:

INFO     2013-05-14 09:48:42,785 server.py:585] default: "GET /static/hi.txt HTTP/1.1" 200 63

浏览器输出:

以斯拉可以很好地看到这段文字;我不知道你为什么不能......嗨!

打破它:

如果我application_readable: true从 app.yaml 中删除该行:

http://localhost/在浏览器中访问:

Http 响应:

ERROR    2013-05-14 09:51:13,290 webapp2.py:1528] [Errno 13] file not accessible: '.../static/hi.txt'

浏览器输出:

500内部服务器错误

服务器出错或无法执行请求的操作。

接下来做什么:

希望你可以从这个例子中倒退。如果它对你不起作用,你就完蛋了。享受一个阳光明媚的 5 月中旬下午,在小路上拖网,并尝试(重新/卸载)安装东西以使这该死的东西运转起来。顶部的列表是我会尝试的列表,不知道任何细节并排除了编程错误。祝你好运!

于 2013-05-14T10:42:52.917 回答