2013-02-14 2 views
-2

Я использую urlfetch, доступный из Google App Engine, для получения содержимого URL-адресов. Но я получаю 500 Internal Server Error.SyntaxError в обработчике Python

Вот полный код приложения, которые я использую: -

compare-hatke.py

import urllib2 
from google.appengine.api import urlfetch 
from google.appengine.ext import webapp 
from google.appengine.ext.webapp.util import run_wsgi_app 
import datetime 

class MainPage(webapp.RequestHandler): 
    def curlTry: 
     url = "http://www.google.com/" 
     result = urlfetch.fetch(url) 
     if result.status_code == 200: 
      print(result.content) 

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


def main(): 
    run_wsgi_app(application) 

if __name__ == '__main__': 
    main() 

app.yaml

application: compare-hatke 
version: 3 
runtime: python27 
api_version: 1 
threadsafe: false 

handlers: 
- url: /.* 
    script: compare-hatke.app 

Вот является журнал ошибок. Я не могу понять синтаксическую ошибку, которую они упоминают

Traceback (most recent call last): 
    File "/python27_runtime/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 196, in Handle 
    handler = _config_handle.add_wsgi_middleware(self._LoadHandler()) 
    File "/python27_runtime/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 269, in _LoadHandler 
    raise ImportError('%s has no attribute %s' % (handler, name)) 
ImportError: <module 'compare-hatke' from '/base/data/home/apps/s~compare-hatke/3.365290288779373200/compare-hatke.pyc'> has no attribute app 

Пожалуйста, скажите мне, где я отсутствую. Благодаря !

+0

Это базовая синтаксическая ошибка Python. Это не имеет никакого отношения к urlfetch. –

+0

OK, но я получаю другую ошибку сейчас :( –

+0

Пожалуйста, не меняйте вопрос после того, как люди уже ответили и прокомментировали его. –

ответ

2

Вы используете определение приложения python2.5 стиле с основным методом().

Вы должны вернуться к 2.7 учебник https://developers.google.com/appengine/docs/python/gettingstartedpython27/helloworld и вы увидите, вы приложение должно выглядеть

import urllib2 
from google.appengine.api import urlfetch 
from google.appengine.ext import webapp2 

import datetime 

class MainPage(webapp2.RequestHandler): 
    def curlTry(self): 
     url = "http://www.google.com/" 
     result = urlfetch.fetch(url) 
     if result.status_code == 200: 
      self.response.write(result.content) 

app = webapp2.WSGIApplication([('/', MainPage)],debug=True) 

, чтобы соответствовать вашему определению app.yaml. Ваш app.yaml относится к compare-hatke.app, что означает, что compare-hatke.pyapp потребность в нем определена где-то, (как в моем примере)

Кроме того вам следует использовать webapp2 с 2.7, и не знает, как ваш метод класса curlTry собирается получить но это отдельная проблема на ваш вопрос.

Я предлагаю вам начать с нуля и работать с 2,7 учебниками, так как здесь вам не хватает нескольких бит.

Я изменил код, чтобы отразить его response.write shoudl, и сделал обработчик методом экземпляра скорее методом класса. Однако вы, текущий app.yaml, не будете отображать запрос GET/POST для curlTry на основе вашего опубликованного app.yaml и текущего кода. Посмотрите еще раз на учебник, который я здесь связал.

T

+0

Спасибо большое!Я думаю, что проблема в том, что сейчас ничего не печатают. Я думаю, это потому, что время, когда оно выполнено, результаты еще не получены. Есть ли какой-либо обработчик onrequestArrival или что-то в python? Это было бы большой помощью! –

+0

Вы не можете печатать с помощью этого обработчика, вам нужно self.response.write(). См. Учебник, который я упомянул. Так как ваш код имеет класс, и, следовательно, не будет доступен объект ответа webapp2. Я не исправил весь ваш код в моем повторном примере. –

+0

Еще раз спасибо! Это сработало для меня :) Ваше решение работало как шарм! –

2

Метод Python в классе должен ссылаться на параметр self в определении функции, чтобы идентифицировать экземпляр, к которому он принадлежит. Это ваша основная синтаксическая ошибка.

Исправить это, вам все равно необходимо настроить маршрутизацию, чтобы ваш класс MainPage мог обрабатывать запрос GET. Это проще всего сделать с помощью метода get в GAE. Документация показывает вам другие методы, как только вы это сделаете.

Попробуйте это:

class MainPage(webapp.RequestHandler): 
    def get(self): # responds to http GET, and adds self parameter 
     url = "http://www.google.com/" 
     result = urlfetch.fetch(url) 
     if result.status_code == 200: 
      print(result.content) 
+0

Извините, но внесенные изменения просто изменили эту ошибку. В нем говорится, что какой-то модуль не найден. Пожалуйста, помогите! –