0

ボトル アプリから奇妙な「RuntimeError: Python オブジェクトの呼び出し中に最大再帰深度を超えました」というメッセージが表示されます。openshift paasサービスで (virtualenv 内の) wsgi ハンドルから実行中。

トレースバックは、何が問題なのかについての手がかりを提供しません

また、開発者のマッチング (例: python pythonapp.py) でボトル スクリプトを直接実行すると、正しく動作することにも言及する必要があります。

編集:この問題が mod_wsgi で実行中のボトルに関連していることを確認するために、開発用コンピューターにインストールしました。ストレート python を実行すると動作します。mod_wsgi で実行すると、この奇妙な RuntimeErrorが表示されます 編集の終わり

問題#201 で、この問題はすでに「解決済み」であることがわかりましたが、おそらく別のユースケースのためです

Linuxサーバーのpython 2.6でボトル0.10.9を使用しています

Critical error while processing request: /about
Error: RuntimeError('maximum recursion depth exceeded while calling a Python object',)
Traceback:
Traceback (most recent call last):
File "path/to/app/virtenv/lib/python2.6/site-packages/bottle-0.10.9-py2.6.egg/bottle.py",
line 824, in wsgi
    out = self._cast(self._handle(environ), request, response)

File "path/to/app/virtenv/lib/python2.6/site-packages/bottle-0.10.9-py2.6.egg/bottle.py",
line 780, in _cast
    return self._cast(out, request, response)


File "path/to/app/virtenv/lib/python2.6/site-packages/bottle-0.10.9-py2.6.egg/bottle.py",
line 780, in _cast
    return self._cast(out, request, response)

File "path/to/app/virtenv/lib/python2.6/site-packages/bottle-0.10.9-py2.6.egg/bottle.py",
line 780, in _cast
    return self._cast(out, request, response)

File "path/to/app/virtenv/lib/python2.6/site-packages/bottle-0.10.9-py2.6.egg/bottle.py",
line 780, in _cast
    return self._cast(out, request, response)

File "path/to/app/virtenv/lib/python2.6/site-packages/bottle-0.10.9-py2.6.egg/bottle.py",
line 780, in _cast
    return self._cast(out, request, response)

File "path/to/app/virtenv/lib/python2.6/site-packages/bottle-0.10.9-py2.6.egg/bottle.py",
line 780, in _cast
    return self._cast(out, request, response)

File "path/to/app/virtenv/lib/python2.6/site-packages/bottle-0.10.9-py2.6.egg/bottle.py",
line 780, in _cast
    return self._cast(out, request, response)

File "path/to/app/virtenv/lib/python2.6/site-packages/bottle-0.10.9-py2.6.egg/bottle.py",
line 780, in _cast
    return self._cast(out, request, response)

File "path/to/app/virtenv/lib/python2.6/site-packages/bottle-0.10.9-py2.6.egg/bottle.py",
line 780, in _cast
    return self._cast(out, request, response)
RuntimeError: maximum recursion depth exceeded while calling a Python object

WSGI ハンドル:

#!/usr/bin/python

import os
import sys
here = os.path.dirname(os.path.abspath(__file__))


try:
    os.environ['PYTHON_EGG_CACHE'] = os.path.join(os.environ['OPENSHIFT_APP_DIR'],'virtenv/lib/python2.6/site-packages')

except:
    os.environ['PYTHON_EGG_CACHE'] = os.path.join(here,'..','data/virtenv/lib/python2.6/site-packages')

print ('python egg cache set to: %s' % os.environ['PYTHON_EGG_CACHE'])
try:

    virtualenv = os.path.join(os.environ['OPENSHIFT_APP_DIR'],"virtenv/bin/activate_this.py")
except:
    virtualenv = os.path.join(here,'..',"data/virtenv/bin/activate_this.py")

print ('virtualenv is in:%s' % virtualenv)
try:
    execfile(virtualenv, dict(__file__=virtualenv))
    print ('executed')
    sys.path.append(here)

except IOError:
    pass

from myapp import application

myapp.py ファイル:

#!/bin/usr/env python
#-*- coding:UTF-8 -*-

from bottle import route,run, view, error, static_file, debug, url, redirect, request, response,  default_app

from wikifetch import init_db,load_session,Wikilink, statistic, wiki_populate
import bottle
from sqlalchemy.exc import StatementError
#from config import production_port, production_server
import json
debug(True)
bottle.TEMPLATE_PATH.append("./views")

init_db()
session = load_session()
try:
    stats = statistic()
except:
    print ("no data yet")
    pass

@route('/wsgi')
def show_ip():
    env = request.environ
    for k,v in env.items():
        print k,": ",v
    return env

@route()
def default():
    redirect("/monitor")

@route(["/monitor","/index","/"])
@view("monitor")
def monitor():
    title = request.query.title
    page = request.query.page or 0
    page = int(page)
    try:
        total = stats[0]
        all = session.query(Wikilink).filter(Wikilink.title.like('%'+ title +'%')).count()
        monitor = session.query(Wikilink).order_by('title').filter(Wikilink.title.like('%'+ title +'%')).offset(page*20).limit(20).all() #filter(Wikilink.id>(page*20))
        #print "page=",page," title=",title,
    except StatementError:
        session.rollback()
        #session.begin()

    #print monitor
    return dict(monitor=monitor,pages=(all/20),number=all,total = total)

@route("/why")
@view("why")
def why():
    return dict()

@route("/about")
@view("about")
def about():
    return dict()

@route("/learned")
@view("learned")
def learned():
    return dict()



@route("/stats")
@view("stats")
def statistic():
    return dict(stats= stats)

@route ("/static/<filepath:path>", name="static")
def static(filepath):
    #print 'yey', filepath
    return static_file(filepath,root = "./static/")


@error(404)
def error404(error):
    return static_file('404.html',root="./static")

#@error(502)
@error(500)
def error500(error):
    return static_file('500.html', root = "./static")

application = default_app()

if __name__ =='__main__':
    from wsgiref.simple_server import make_server #using the builtin wsgi server
    httpd = make_server('localhost', 8052, application)

デバッグの手がかりがあれば幸いです。

編集:再帰制限を低く設定しようとしましたが、他のことが失敗するレベル(正確には37)を超えると、他のこと(path.append、sqlalchemyなど)が失敗し、このエラーメッセージが表示されます。エラー ログを追跡したところ、エラー スタックの前に別の 2 行を生成できました。

[Mon Mar 26 14:50:52 2012] [error] no data yet #if you look in the code above - means that wikiwatch.py file passed the first 'stats' function

[Mon Mar 26 14:50:52 2012] [error] /home/usrname/workspace/appname/data/virtenv/lib/python2.6/site-packages/bottle.py:824: DeprecationWarning: Error handlers must not return :exc:`HTTPResponse`.
[Mon Mar 26 14:50:52 2012] [error]   out = self._cast(self._handle(environ), request, response)
4

1 に答える 1

1

コードがエラー ハンドラーをトリガーしており、ハンドラーが別のエラーを発生させているようです。

wsgi ハンドラーなしで動作するため、最初のエラーを引き起こしているのはおそらくパスの問題です。エラー ハンドラーを無効にして、ボトルのエラー ページを表示すると、問題が明らかになる場合があります。

ハンドラー内で発生したエラーに注意して、static()関数ではキーワード引数を使用しているのroot="./static/"に対し、エラーハンドラーでは末尾のスラッシュを省略していることに気付きました。

于 2012-03-27T17:02:09.587 に答える