Как я могу загрузить статические файлы в GAE (python) с app.yaml? - PullRequest
3 голосов
/ 05 сентября 2011

Я делаю проект с использованием GAE, и у меня ужасная проблема.

Я хотел создать бота для Twitter, поэтому я начал первый шаг с публикации твитов.Я сделал файл tweets.txt в той же папке, что и dailybasic.py.

Вот некоторые части кодов.

#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»).

Вот дерево файлов:

  • root
    • dailybasic
      • dailybasic.py
      • tweets.txt
    • main.py
    • app.yaml, cron.yaml, index.yaml
    • index.html

Я хочу, чтобы файл index.html содержал только HTML-коды без каких-либо сценариев.

Как разместить файлы и написать app.yaml?

(И извините заплохой английский)

* добавлено

Проблема в том, что open () не работаетs, потому что файл 'tweets.txt' не загружен или находится в неправильном каталоге.

Ответы [ 3 ]

7 голосов
/ 05 сентября 2011

Статические файлы могут быть доставлены непосредственно пользователю только по URL-адресу, указанному в app.yaml. Они не могут быть прочитаны вашим приложением, поскольку они развернуты на серверах, которые обслуживают только статические файлы, а не в инфраструктуре, в которой выполняется ваше приложение.

Если вам нужно только прочитать файлы из вашего скрипта, просто загрузите их как нестатические. Если вам нужно одновременно передавать файлы статически непосредственно в браузер пользователя и читать их из ваших сценариев, вам необходимо включить 2 копии файлов в ваше приложение (хотя символическая ссылка в нестатическом каталоге будет считаться второй скопируйте и разверните).

1 голос
/ 05 сентября 2011

Пути указаны относительно каталога, содержащего app.yaml, поэтому попробуйте следующее:

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

Вы хотите сопоставить файл index.html с корневым URL /?Механизм приложений не делает это автоматически, как некоторые другие веб-серверы.Чтобы сделать это сопоставление, попробуйте что-то вроде этого:

- url: /
  static_files: index.html
  upload: index.html
0 голосов
/ 24 октября 2015

почему бы не загрузить файл в главный каталог, а просто использовать:

open("tweets.txt") 

без пути.

Я использую его для чтения файлов .csv без проблем в GAE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...