是谷歌应用程序引擎适合我(托管一些快速更新文本文件与python创建)

时间:2013-02-03 05:38:10

标签: python google-app-engine

我有一个python脚本,可以创建一些文本文件,然后将其上传到我当前的Web主机。这是每5分钟完成一次。文本文件用于软件程序,每5分钟获取一次最新版本。现在我在我的网络主机上运行它,但我想转向GAE以提高可靠性。 (另外,因为我目前的网络主机不允许根据他们的服务条款进行普通文件托管。)

Google应用引擎适合我吗?我有一些python的经验,但没有一个与Web技术有关。我浏览了基本的hello world教程,对于一个网站看起来很简单,但我不知道如何实现我的项目。我还担心任何可能导致最新文件无法在谷歌服务器上快速传播的缓存。

2 个答案:

答案 0 :(得分:0)

是和否。

Appengine在可靠性,服务器速度,功能等方面都很出色。但是,它有两个主要缺点:您处于沙盒环境中(没有文件系统访问权限,必须使用数据存储区),并且您按实例小时付费。通常,如果您只是托管一次访问过的小型服务器,您可以免费托管;如果你每天都在运行一个cron工作,你必须始终至少使用一个实例,这会花费你的钱。

您对谷歌服务器上的速度和传播的担忧是没有意义的;他们有一个全球时间服务器通过他们的数据中心脉动,确保您的操作是原子的;如果您请求一致性= STRONG的数据,只要您在put之后开始获取,您将看到更新的数据。

答案 1 :(得分:0)

如果您的文本文件总是在一个meg以下,并且您不打算扩展到大量用户,那么设置系统将文本文件作为TextProperty发布到实体中非常容易。如果你是GAE的完全新手,它可能是<运行1个小时。我这么做了很多,以加快我的HTML工作的测试(节拍部署你的静态文件一英里)。以下是一些非常简单的代码提取示例。 (如果我在修改它时将其搞砸了以便简化/匿名化,请道歉。)HTH -stevep

#client side python...

import time
import urllib
import httplib


def processUpdate(filename):
    f = open(filename, 'rb')
    parts = filename.split('/')
    name = parts[len(parts)-1]
    print name
    html = f.read()
    f.close()
    htmlToLoad = urllib.quote(html)
    params = urllib.urlencode({'key':'your_arbitrary_password_here(or use admin account)',
                                'name':name,
                                'htmlToLoad':htmlToLoad,
                                })
    headers = {'Content-type': 'application/x-www-form-urlencoded', 'Accept': 'text/plain'}
    #conn = httplib.HTTPConnection('your_localhost_here')
    conn = httplib.HTTPConnection('your_app_id_here')
    conn.request('POST', '/your_on-line_handler_url_stub_here', params, headers)
    response = conn.getresponse()
    print '%s, %s, %s' % (filename, response.status, response.reason)


def main():
    startTime = time.time()
    print '----------Start Process----------\n'
    processUpdate('your_full_file01_path_here')
    processUpdate('your_full_file02_path_here')
    processUpdate('your_full_file03_path_here')
    print '\n----------End Process----------', time.time() - startTime

if __name__ == '__main__':
    main()


# GAE Kind
class Html_Source(db.Model):
    html = db.TextProperty(required=True, indexed=False)
    dateM = db.DateTimeProperty(required=True, indexed=False, auto_now=True)
    v = db.IntegerProperty(required=False, indexed=False, default=1)


#GAE handler classes

EVENTUAL = db.create_config(read_policy=db.EVENTUAL_CONSISTENCY)


class load_test(webapp2.RequestHandler):
    def post(self):
        self.response.clear()
        if (self.request.get('key') != 'your_arbitrary_password_here(or use admin account)'):
            logging.info("----------------------------------bad key")
            return
        name = self.request.get('name')
        rec = Html_Source(
                    key_name = name,
                    html = urllib.unquote(self.request.get('htmlToLoad')),
                    )
        rec.put()
        self.response.out.write('OK=' + name)


class get_test(webapp2.RequestHandler):
    def get(self):
        urlList = self.request.url.split('/')
        name = urlList[len(urlList) - 1]
        extension = name.split('.')
        type = '' if len(extension) < 2 else extension[1]
        typeM = None
        if type == 'js': typeM = 'application/javascript'
        if type == 'css': typeM = 'text/css'
        if type == 'html': typeM = 'text/html'
        self.response.out.clear()
        if typeM: self.response.headers["Content-Type"] = typeM
        logging.info('%s-----name, %s-----typeM' % (name, typeM))
        htmlRec = Html_Source.get_by_key_name(name, config=EVENTUAL)
        if htmlRec is None:
            self.response.out.write('<p>invalid:%s</p>' % (name))
            return
        self.response.out.write(htmlRec.html)