0

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

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

4

2 回答 2

0

是和不是。

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

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

于 2013-02-03T06:32:31.687 回答
0

如果您的文本文件总是小于 1 兆,并且您不打算扩展到大量用户,那么设置一个系统将您的文本文件作为 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)
于 2013-02-03T16:26:07.740 回答