2016-01-06 6 views
5

पर दृढ़ता जोड़ने में त्रुटि उदारता द्वारा ऑनलाइन प्रोजेक्ट पर काम कर रहा हूं। मैं डाटाबेस युक्त सर्वर चलाने के लिए, vagrant द्वारा कॉन्फ़िगर किया गया है। दुर्भाग्यवश जब मैंने कोड दृढ़ता देने की कोशिश की, तो सर्वर हर बार एक त्रुटि देता है। मैं अजगर के लिए नया हूँ इसलिए कृपया किसी भी स्पष्ट गलतियों को माफ कर दो।Pyscopg डीबी - कोड

यहाँ त्रुटि है:

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 - इस फाइल को एचटीएमएल renders डीबी से डेटा ला रहा है: http://pastebin.com/ZiHWiiwr

कृपया मदद करें!

उत्तर

2

असाइन किया गया है आप length = int(env.get('CONTENT_LENGTH', 0)) (forum.py:68) के साथ WSGI वातावरण में जानना चाहते हैं। बीच (

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

उत्पादन मैं जब परीक्षण सर्वर क्वेरी करने हो रही है: मैं बस एक नमूना WSGI सर्वर (उदाहरण के अजगर डॉक्स से लिया कोड) है, जो अनुरोध पर सभी उपलब्ध पर्यावरण के चर आउटपुट भाग गया कई अन्य चर):

SERVER_PORT: 8000 
CONTENT_LENGTH: 
GLADE_CATALOG_PATH: : 

आप देखते हैं कि CONTENT_LENGTH चर खाली है। ऐसा लगता है कि आपके आवेदन में भी मामला है।

env-शब्दकोश अब env.get('CONTENT_LENGTH', 0) साथ क्वेरी की जाती है, तो CONTENT_LENGTH-key वास्तव में पाया जाता है, लेकिन यह मूल्य है एक खाली स्ट्रिंग है - यही कारण है कि प्राप्त() विधि से वापस लौटकर आपके निर्दिष्ट डिफ़ॉल्ट मान 0.

है '' नहीं

चूंकि एक खाली स्ट्रिंग को int में परिवर्तित नहीं किया जा सकता है, इसलिए आपको ValueError मिल रहा है।

अपवाद को पकड़ने की कोशिश करो और अपने कोड काम करना चाहिए:

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

स्पष्टीकरण के लिए धन्यवाद! एमेच्योर गलती .. लेकिन एक बार फिर धन्यवाद! –

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 

जब से तुम अजगर के लिए नए हैं नीचे दिए कुछ आप संशोधित लाइन पहले यह एक conditional expression के रूप में जानते है के बारे में पता होना चाहिए रहे हैं करने के लिए है कि रेखा को बदलें, झूठी की एक बूलियन मान है पायथन में दूसरा रिक्त स्ट्रिंग हैं इसलिए जब

  • env.get ('CONTENT_LENGTH') एक खाली स्ट्रिंग तो लंबाई असाइन किया गया है रिटर्न 0
  • env.get ('CONTENT_LENGTH') एक गैर रिक्त स्ट्रिंग या एक पूर्णांक देता है तो int धर्मान्तरित कि करने के लिए मूल्य यह पूर्णांक प्रतिनिधित्व
  • है
  • env.get ('CONTENT_LENGTH') की ओर से एक 0 (जो झूठी की एक बूलियन मान है) तो 0