2010-04-13 8 views
37

È possibile aprire un file su GAE solo per leggere il suo contenuto e ottenere l'ultimo tag modificato?Leggi un file su App Engine con Python?

ottengo un IOError: [Errno 13] file non accessibile: So che non posso cancellare o aggiornare, ma credo che la lettura dovrebbe essere possibile chiunque ha affrontato un problema simile?

os.stat(f,'r').st_mtim 
+0

Provare a usare una directory relativa e assicurarsi che sia nella vostra applicazione, non è la radice –

+0

i ve già provato che quando ho ho un problema di percorso ottengo otehr Errno 2 – PanosJee

+0

Un googler ha risposto e mi ha detto che non è possibile leggere i file contrassegnati come statici. Ma questo è il mio problema in quanto voglio aprire i miei file JS/CSS. Ti farò sapere se trovo smth – PanosJee

risposta

52

Probabilmente hai dichiarato il file come statico in app.yaml. I file statici non sono disponibili per la tua applicazione; se è necessario servirli entrambi come file statici e leggerli come file dell'applicazione, è necessario includere 2 copie nel progetto (utilizzando idealmente i collegamenti simbolici, quindi non è necessario mantenere una copia effettiva.)

Aggiornamento nov 2014:

Come suggerito nei commenti, ora è possibile farlo con la bandiera application_readable:

application_readable 

Optional. By default, files declared in static file handlers are uploaded as static data and are only served to end users, they cannot be read by an application. If this field is set to true, the files are also uploaded as code data so your application can read them. Both uploads are charged against your code and static data storage resource quotas.

Vedi https://cloud.google.com/appengine/docs/python/config/appconfig#Static_Directory_Handlers

+0

Come posso utilizzare i symblink nell'ambiente GAE? – PanosJee

+7

Si creano i collegamenti simbolici nella copia locale; i file verranno effettivamente copiati due volte su App Engine: una volta sui file server statici e una volta sui server delle applicazioni. Puoi anche includere pacchetti esterni legando le tue copie locali alla directory dell'applicazione piuttosto che copiare l'intero pacchetto in ogni progetto che lo utilizza. – geoffspear

+0

questo è stato un suggerimento fantastico! Grazie! – PanosJee

11

È possibile leggere i file, ma sono sulla stramba filesystem GAE di Goooogle modo da avere per utilizzare un percorso relativo. Ho appena montato un'app rapida con un file main.py e test.txt nella stessa cartella. Non dimenticare la 'e' su st_mtime.

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() 
+7

Non c'è nulla di insolito nell'accesso ai file per le app tranne la non disponibilità dei file statici. –

+0

Funziona con webapp2? – Jonny

6

+1 per la nuova funzione "application_readable: true". Prima di utilizzare questa nuova funzione, mi sono imbattuto in un problema con il file system "wacky" di GAEs durante l'importazione di Montylingua NLP.

Problema: Monty utilizza l'open (nome file, 'rb') e un puntatore di file su file_ptr.read() in byte dai file statici. La mia implementazione ha funzionato sul mio sistema Windows locale ma non è riuscita a essere implementata!

La correzione: specificare i byte tenuti a leggere file_ptr.read (4) # 4 byte binario

sembra essere qualcosa legato al server GAE 64 bit che vogliono leggere in più (8 per default) byte. Ad ogni modo, ci è voluto un po 'per trovare quel problema. Montylingua carica ora.

1

mi è venuta strano, ma la soluzione di Jinja :) :)

Serve file statici direttamente a volte diventare un mal di testa con GAE. Possibile trade-off da prestazioni consentono di andare avanti con straigh 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 

hai presa;) Ho provato e ha funzionato.

1

Con webapp2, supponendo di avere pages/index.html allo stesso percorso come 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)