2011-09-05 2 views
3

Я делаю проект с использованием GAE и имею ужасную проблему.Как загрузить статические файлы в GAE (python) с помощью app.yaml?

Я хотел сделать твиттер-бот, поэтому я начал первый шаг с публикации твитов. Я сделал «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»).

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

  • корень
    • dailybasic
      • dailybasic.py
      • tweets.txt
    • main.py
    • app.yaml, cron.yaml, index.yaml
    • index.html

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

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

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

* добавлено

Проблема заключается в том, открытые() не работает, потому что «tweets.txt» не загружен или в неправильном каталоге.

ответ

1

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

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

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

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

Ну, у меня все еще такая же проблема, но мне будет полезно написать их - я думаю. Благодарю. –

+0

Хорошо. Я должен быть ясным - я хочу загрузить «tweets.txt» и сделать скрипт python прочитанным. –

+0

@Sidus_smg: Какое сообщение об ошибке вы получаете, когда делаете то, что именно? –

7

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

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

0

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

open("tweets.txt") 

без пути.

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

Смежные вопросы