5

Udacityによるオンライン プロジェクトに取り組んでいます。vagrantデータベースを含むサーバーを実行するために、彼らによって構成されています。残念ながら、コードを永続化しようとすると、サーバーは毎回エラーを返します。私はpythonが初めてなので、明らかな間違いを許してください。

エラーは次のとおりです。

Serving HTTP on port 8000...
Traceback (most recent call last):
  File "/usr/lib/python2.7/wsgiref/handlers.py", line 85, in run
    self.result = application(self.environ, self.start_response)
  File "forum.py", line 95, in Dispatcher
    return DISPATCH[page](env, resp)
  File "forum.py", line 68, in Post
    length = int(env.get('CONTENT_LENGTH', 0))
ValueError: invalid literal for int() with base 10: ''
10.0.2.2 - - [06/Jan/2016 04:44:16] "GET /post HTTP/1.1" 500 59
10.0.2.2 - - [06/Jan/2016 04:44:16] "GET /favicon.ico HTTP/1.1" 404 22

そして、これはforumdb.pyで変更したコードです:

#
# Database access functions for the web forum.
# 

import psycopg2

## Database connection

def GetAllPosts():
    DB = psycopg2.connect("dbname=forum")
    c = DB.cursor()
    c.execute("SELECT time, content FROM posts ORDER BY time DESC")
    posts = ({'content': str(row[1]), 'time': str(row[0])}
             for row in c.fetchall())

    # This returns a dictionary -- returning just c.fetchall() will return a list of tuples

    DB.close()
    return posts

def AddPost(content):
    DB = psycopg2.connect("dbname=forum")
    c = DB.cursor()
    c.execute("INSERT INTO posts (content) values ('%s')" % content)
    DB.commit()
    DB.close()

forum.py - このファイルは、DB からデータを取得する html をレンダリングします: http://pastebin.com/ZiHWiiwr

助けてください !

4

2 に答える 2

2

length = int(env.get('CONTENT_LENGTH', 0))(forum.py:68)で WSGI 環境をクエリしています。サンプルの WSGI サーバー (サンプル コードは python docs から取得) を実行しました。これは、要求に応じて使用可能なすべての環境変数を出力します。

from wsgiref.util import setup_testing_defaults
from wsgiref.simple_server import make_server

# A relatively simple WSGI application. It's going to print out the
# environment dictionary after being updated by setup_testing_defaults
def simple_app(environ, start_response):
    setup_testing_defaults(environ)

    status = '200 OK'
    headers = [('Content-type', 'text/plain')]

    start_response(status, headers)

    ret = ["%s: %s\n" % (key, value)
           for key, value in environ.iteritems()]
    return ret

httpd = make_server('', 8000, simple_app)
print "Serving on port 8000..."
httpd.serve_forever()

テストサーバーにクエリを実行したときに得られる出力は(他の多くの変数の中でも)次のとおりです。

SERVER_PORT: 8000
CONTENT_LENGTH: 
GLADE_CATALOG_PATH: :

CONTENT_LENGTH 変数が空であることがわかります。これは、アプリケーションにも当てはまるようです。

env-dictionary が で照会された場合、env.get('CONTENT_LENGTH', 0)実際CONTENT_LENGTH-keyには見つかりましたが、その値は空の文字列です。そのため、get() メソッドは指定したデフォルト値 0 ではなく '' を返します。

空の文字列は int に変換できないため、ValueError が発生します。

例外をキャッチしてみてください。コードが機能するはずです。

try:
    length = int(env.get("CONTENT_LENGTH", 0))
except ValueError:
    length = 0
于 2016-01-11T18:58:19.840 に答える
2

行が原因で現在のエラーが発生しています

length = int(env.get('CONTENT_LENGTH', 0))

forum.pyで。基本的にキーCONTENT_LENGTHは存在し、それは空の文字列であり、空の文字列は int に変換できません。その行を次のように変更します

length = int(env.get('CONTENT_LENGTH')) if env.get('CONTENT_LENGTH') else 0

Python は初めてなので、変更された行について知っておくべきことがいくつかあります。まず、条件式として知られています。Python の 2 番目の空の文字列はブール値 False を持っています。

  • env.get('CONTENT_LENGTH') は空の文字列を返し、長さには 0 が割り当てられます
  • env.get('CONTENT_LENGTH') は、空でない文字列または整数を返し、intその値を整数表現に変換します
  • env.get('CONTENT_LENGTH') は 0 (ブール値は false) を返し、0 が割り当てられます
于 2016-01-11T18:49:13.837 に答える