如何使用 app.yaml 在 GAE(python) 中上传静态文件?

Posted

技术标签:

【中文标题】如何使用 app.yaml 在 GAE(python) 中上传静态文件?【英文标题】:How can I upload static files in GAE(python) with app.yaml? 【发布时间】:2011-11-10 14:16:26 【问题描述】:

我正在使用 GAE 制作一个项目,但遇到了一个可怕的问题。

我想制作一个推特机器人,所以我开始了发布推文的第一步。我在与“dailybasic.py”相同的文件夹中创建了“tweets.txt”。

以下是部分代码。

#app.yaml

application: mathgirlna
version: 1
runtime: python
api_version: 1

handlers:
# - url: /static
#  static_dir: static

- url: /dailybasic   
  script: dailybasic/dailybasic.py 

- url: /.*
  script: main.py

main.py(它可以工作,没有错误)

#!/usr/bin/python  
# -*- coding: utf-8 -*-

import os
import sys

from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext import db
from google.appengine.ext.webapp import template
from google.appengine.ext.webapp.util import run_wsgi_app
import wsgiref.handlers

class MainPage(webapp.RequestHandler):
    def get(self):
        path = os.path.join(os.path.dirname(__file__), 'index.html')
        self.response.out.write(template.render(path, None))


application = webapp.WSGIApplication([('/', MainPage)],
                                     debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()

dailybasic.py(每 5 分钟运行一次)

#!/usr/bin/python  
# -*- coding: utf-8 -*-

import os
import sys
from google.appengine.ext import webapp
from google.appengine.ext import db
from google.appengine.ext.webapp.util import run_wsgi_app
import tweepy
import wsgiref.handlers
import time

def tweetit(tweet):
   if len(tweet)<140:
      api.update_status(tweet)
   else:
      diaryentries.append(tweet)

consumer_key = '******************'
consumer_secret = '*******************************************'
access_token = '**************************************************'
access_token_secret = '****************************************'

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)

class dailybasic(webapp.RequestHandler):
    def get(self):
        now = time.localtime()
        path = os.path.join(os.path.dirname(__file__), 'tweets.txt')
        f_db = open(path, 'r')
        db = f_db.readline() 
        while db != '':
            todaynow = []
            wday = now.tm_wday
            if db[(wday+1)%7]=='1' and now.tm_hour * 60 + now.tm_min <= int(db[8:10]) * 60 + int(db[11:13]) and now.tm_hour * 60 + now.tm_min + 5 > int(db[8:10]) * 60 + int(db[11:13]) :
                todaynow.append(db[14:])
        if(len(todaynow) != 0):
            import random
            tweetit(todaynow[random.randrange(0,len(todaynow)-1)])


application = webapp.WSGIApplication([('/dailybasic', dailybasic)],
                                     debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()

cron.yaml

cron:
- description: day process
  url: /dailybasic
  schedule: every 5 minutes from 06:00 to 01:30
  timezone: Asia/Seoul

我在谷歌上搜索了这个问题,并尝试了我可以放入“app.yaml”的“##”部分的所有内容,但没有成功(它能够被部署,但 GAE 警告为“文件”未找到处理程序引用:dailybasic.py')。

这是一个文件树:

根 日常基础 dailybasic.py tweets.txt main.py app.yaml、cron.yaml、index.yaml index.html

我想保留 'index.html' 只包含 html 代码,没有任何脚本。

我应该如何放置文件并编写app.yaml?

(对不起英语不好)

*添加

问题是,open() 不起作用,因为 'tweets.txt' 没有上传或在错误的目录中。

【问题讨论】:

【参考方案1】:

静态文件只能通过 app.yaml 中指定的 URL 直接提供给用户。您的应用程序无法读取它们,因为它们被部署到仅提供静态文件的服务器,而不是运行您的应用程序的基础架构。

如果您只需要从脚本中读取文件,只需将它们作为非静态文件上传即可。如果您需要将文件直接静态地提供给用户的浏览器并从脚本中读取它们,则需要在应用程序中包含文件的 2 个副本(尽管非静态目录中的符号链接将计为秒)复制并部署)。

【讨论】:

【参考方案2】:

路径是相对于包含 app.yaml 的目录指定的,所以试试这个:

handlers: 
- url: /dailybasic   
  script: dailybasic/dailybasic.py 

您是否要将文件 index.html 映射到根 url / ? App 引擎不会像其他一些 Web 服务器那样自动执行此操作。要进行此映射,请尝试以下操作:

- url: /
  static_files: index.html
  upload: index.html

【讨论】:

好吧,我仍然有同样的问题,但写出来会很有用——我想。谢谢。 好的。我必须清楚 - 我想上传“tweets.txt”,并让 python 脚本读取它。 @Sidus_smg:你得到什么错误信息,你什么时候做什么? 它每 5 分钟运行一次,每次运行 GAE 都会打印“找不到处理程序引用的文件:dailybasic.py” @Sidus_smg:您是使用 cron.yaml 每 5 分钟运行一次,还是 index.html 页面上有一个计时器来执行 AJAX 调用,或者其他什么?您可以使用 app.yaml 的全部当前内容编辑您的问题吗?【参考方案3】:

为什么不上传主目录中的文件而直接使用:

open("tweets.txt") 

没有路径。

我使用它在 GAE 中毫无问题地读取 .csv 文件。

【讨论】:

以上是关于如何使用 app.yaml 在 GAE(python) 中上传静态文件?的主要内容,如果未能解决你的问题,请参考以下文章

在构建期间使用 gsutil builder 获取 app.yaml 来保护 GAE 环境变量?

使用 Flask-Restless 进行 GAE app.yaml 路由

为子域配置 GAE 应用程序 app.yaml

GAE 通过 app.yaml、python 装饰器或 users.get_current_user 强制登录?

如何在 Google App Engine 的 app.yaml 文件中配置 servlet 过滤器?

如何在gae中部署django应用程序时包含migrate命令