GAEでファイルを開いて、その内容を読み取り、最後に変更されたタグを取得することはできますか?
IOError:[Errno 13]ファイルにアクセスできません:削除または更新できないことはわかっていますが、読み取りは可能であるはずです。同様の問題に誰かが直面していますか?
os.stat(f,'r').st_mtim
おそらく、app.yamlでファイルを静的として宣言しました。静的ファイルはアプリケーションで使用できません。それらを静的ファイルとして提供し、アプリケーションファイルとして読み取る必要がある場合は、プロジェクトに2つのコピーを含める必要があります(理想的にはシンボリックリンクを使用するため、実際のコピーを維持する必要はありません)。
2014年11月の更新:
コメントで示唆されているように、これをapplication_readableフラグで行うことができます:
application_readable
オプション。デフォルトでは、静的ファイルハンドラーで宣言されたファイルは静的データとしてアップロードされ、エンドユーザーにのみ提供されます。アプリケーションで読み取ることはできません。このフィールドがtrueに設定されている場合、ファイルもコードデータとしてアップロードされ、アプリケーションで読み取ることができます。どちらのアップロードも、コードと静的データストレージのリソース割り当てに対して課金されます。
https://cloud.google.com/appengine/docs/python/config/appconfig#Static_Directory_Handlers を参照してください
ファイルを読み取ることはできますが、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()
新しい「application_readable:true」機能の+1。この新しい機能を使用する前に、GAEの "wacky"ファイルシステムでNLP Montylinguaをインポートする際に問題が発生しました。
問題:Montyは、open(filename、 'rb')および静的ファイルからのバイト単位のfile_ptr.read()へのファイルポインターを使用します。私の実装はローカルのWindowsシステムで機能しましたが、展開時に失敗しました!
修正:file_ptr.read(4)#4バイナリバイトを読み取るために予期されるバイトを指定する
より多くのバイト(デフォルトでは8バイト)を読み取りたい64ビットGAEサーバーに関連するもののようです。とにかく、その問題を見つけるのにしばらく時間がかかりました。モンティリンガがロードされます。
私は奇妙だが実用的な解決策を思いついた:) 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
あなたはそれを手に入れましたか;)私はテストし、それはうまくいきました。
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)