2016-01-06 16 views
5

Tôi đang làm việc trên một dự án trực tuyến theo số Udacity. Tôi đang sử dụng vagrant được cấu hình bởi chúng, để chạy máy chủ chứa Cơ sở dữ liệu. Thật không may khi tôi đã cố gắng để cung cấp cho các mã kiên trì, máy chủ trả về một lỗi mỗi lần. Tôi mới để python vì vậy xin vui lòng tha thứ cho bất kỳ sai lầm rõ ràng.Pyscopg DB - Lỗi Thêm Sự kiên trì vào mã

Dưới đây là lỗi:

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 

Và đây là đoạn code mà tôi đã thay đổi trong 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 - file này ám chỉ rằng html đưa dữ liệu từ DB: http://pastebin.com/ZiHWiiwr

Xin vui lòng trợ giúp!

Trả lời

2

Bạn đang truy vấn môi trường WSGI với length = int(env.get('CONTENT_LENGTH', 0)) (forum.py:68). Tôi chỉ cần chạy một máy chủ mẫu WSGI (mã ví dụ được lấy từ các tài liệu python), mà kết quả đầu ra tất cả các môi trường có sẵn-biến theo yêu cầu:

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() 

Kết quả tôi nhận được khi truy vấn kiểm tra-server là (trong số nhiều biến khác):

SERVER_PORT: 8000 
CONTENT_LENGTH: 
GLADE_CATALOG_PATH: : 

Bạn thấy biến CONTENT_LENGTH trống. Điều này có vẻ là trường hợp trong ứng dụng của bạn.

Nếu env-Từ điển hiện đang truy vấn với env.get('CONTENT_LENGTH', 0), The CONTENT_LENGTH-key là thực sự tìm thấy, nhưng giá trị của nó là một chuỗi rỗng - đó là lý do tại sao method get() trả về '' chứ không phải của bạn giá trị mặc định quy định 0.

Vì chuỗi rỗng không thể chuyển đổi thành int, bạn nhận được ValueError.

Cố gắng thu hút sự ngoại lệ và mã của bạn nên làm việc:

try: 
    length = int(env.get("CONTENT_LENGTH", 0)) 
except ValueError: 
    length = 0 
+0

Cảm ơn bạn đã giải thích! Amateur sai lầm .. Nhưng cảm ơn bạn một lần nữa! –

2

lỗi hiện tại của bạn đang diễn ra vì dòng

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

trong forum.py. Về cơ bản khóa CONTENT_LENGTH tồn tại và nó là một chuỗi rỗng và một chuỗi rỗng không thể được chuyển đổi thành một int. Thay đổi dòng để

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

Vì bạn là người mới đến Python có một vài điều bạn nên biết về các dòng biến đổi đầu tiên nó được biết như là một conditional expression, chuỗi rỗng thứ hai trong Python là có một giá trị boolean False vì thế khi

  • env.get ('CONTENT_LENGTH') trả về một chuỗi rỗng sau đó chiều dài được gán 0
  • env.get ('CONTENT_LENGTH') trả về một chuỗi rỗng không hoặc một số nguyên sau đó int chuyển đổi giá trị đó đại diện số nguyên là
  • env.get ('CONTENT_LENGTH') trả về 0 (trong đó có một giá trị boolean của false) thì 0 được gán
Các vấn đề liên quan