是否可以在GAE上打开文件只是为了读取其内容并获取最后修改的标签?
我收到IOError:[Errno 13]文件无法访问: 我知道我不能删除或更新,但我相信阅读应该是可能的 有没有人遇到类似的问题?
os.stat(f,'r').st_mtim
答案 0 :(得分:54)
您可能已在app.yaml中将该文件声明为静态。您的应用程序无法使用静态文件;如果您需要将它们作为静态文件提供并将它们作为应用程序文件读取,则需要在项目中包含2个副本(理想情况下使用符号链接,因此您实际上不必维护实际的副本。)
2014年11月更新:
正如评论中所建议的那样,您现在可以使用application_readable标志执行此操作:
application_readable
可选。默认情况下,在静态文件处理程序中声明的文件是 作为静态数据上传并且仅提供给最终用户,他们不能 由应用程序读取。如果此字段设置为true,则文件为 也上传为代码数据,以便您的应用程序可以读取它们。都 上传是针对您的代码和静态数据存储资源收取的 配额。
请参阅https://cloud.google.com/appengine/docs/python/config/appconfig#Static_Directory_Handlers
答案 1 :(得分:11)
您可以阅读文件,但它们位于Goooogle古怪的GAE文件系统上,因此您必须使用相对路径。我刚刚在同一个文件夹中发布了一个带有main.py文件和test.txt的快速应用程序。不要忘记st_mtime上的'e'。
import os
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
class MainHandler(webapp.RequestHandler):
def get(self):
path = os.path.join(os.path.split(__file__)[0], 'test.txt')
self.response.out.write(os.stat(path).st_mtime)
def main():
application = webapp.WSGIApplication([('/', MainHandler)],
debug=True)
util.run_wsgi_app(application)
if __name__ == '__main__':
main()
答案 2 :(得分:6)
+1表示新的“application_readable:true”功能。在使用这个新功能之前,我确实遇到了GAE的“古怪”文件系统的问题,同时要导入NLP Montylingua。
问题:Monty使用open(filename,'rb')和来自静态文件的file_ptr.read()文件指针。我的实现在我的本地Windows系统上运行但在部署时失败了!
修复:指定读取file_ptr.read(4)#4二进制字节
的预期字节数似乎是与想要读取更多(默认为8个)字节的64位GAE服务器相关的东西。无论如何,花了一段时间才发现这个问题。 Montylingua现在加载。
答案 3 :(得分:2)
我出现了奇怪但工作的解决方案:) Jinja:)
直接提供静态文件有时会成为GAE的头疼问题。可以通过表现进行权衡让你与Jinja一起前进
- url: /posts/(.*\.(md|mdown|markdown))
mime_type: text/plain
static_files: static/posts/\1
upload: posts/(.*\.(md|mdown|markdown))
from jinja2 import Environment
from jinja2.loaders import FileSystemLoader
posts = Environment(loader=FileSystemLoader('static/posts/')) # Note that we use static_files folder defined in app.yaml
post = posts.get_template('2013-11-13.markdown')
import markdown2 # Does not need of course
class Main(webapp2.RequestHandler):
def get ( self ):
self.response.headers[ 'Content-Type' ] = 'text/html'
self.response.write ( markdown2.markdown( post.render()) ) # Jinja + Markdown Render function
你有没有得到它;)我测试过并且有效。
答案 4 :(得分:1)
使用webapp2,假设您pages/index.html
与main.py
的路径相同:
#!/usr/bin/env python
import webapp2, os
class MainHandler(webapp2.RequestHandler):
def get(self):
path = os.path.join(os.path.split(__file__)[0], 'pages/index.html')
with open(path, 'r') as f:
page_content = f.read()
self.response.write(page_content)
app = webapp2.WSGIApplication([
('/', MainHandler)
], debug=True)
答案 5 :(得分:0)
我找不到文件未被标记为静态的答案,而您正在尝试以'rt'
模式读取它;显然那是行不通的。您可以,但是在模式'rb'
或纯文本'r'
下打开文件都可以。 (我在“ t”上浪费了大约10分钟。)