2013-04-17 2 views
-1

Я бег локального CGIHttpServer в Python, и я использую эту программу питона, чтобы запустить что-то в этом сервере:«Может только POST для CGI скриптов» 501 ошибки

''' submit data to form using robots ''' 
import urllib 
import pprint 


# hacking gullible app 
url = "http://localhost:8000/cgi-bin/w5/captcha.example/vote_app/gullible_app.py" 

def vote(lecturer): 
    params = urllib.urlencode({'lecturer': lecturer,'submit':'submit'}) 
    f = urllib.urlopen(url, params) 
    pprint.pprint(f.fp.readlines()) 

vote("Ivo") 

Это говорит мне, что это может только POST к сценариям CGI, которые мне кажутся действительно странными, потому что скрипт python открывается в моем веб-браузере по этому адресу просто отлично. Итак ... он работает в моем браузере отлично, но не тогда, когда программа python пытается отправить POST на этот URL. Что здесь происходит? (В интернете очень мало информации об этом - я попытался изучить эту проблему, чтобы решить ее самостоятельно, но есть только 3-4 человека, которые упоминают эту проблему)

EDIT: Извините, ребята! Я не понял GET и POST. Я должен был включить это в вопрос - это программа python «gullible_app.py». Как вы можете видеть, форма выполняет операцию «POST»

import cgi 
import cgitb; cgitb.enable() 

# form generation 
# ------------------------------------------------------- 
def print_form(): 
    print "Content-Type: text/html\n" 
    print ''' 
<html> 
<body> 
    <form method="post" action="gullible_app.py"> 
     <p>Select your favorite lecturer:</p> 
     <input type="radio" name="lecturer" value="harald" /> Harald 
     <input type="radio" name="lecturer" value="ivo" /> Ivo 
     <input type="submit" name="submit" /> 
    </form> 
</body> 
</html> 
''' 

# response generation 
# ------------------------------------------------------- 
def print_response(): 
    print 'Content-Type: text/html\n' 
    print '<html><body>Thank you for your vote!</body></html>' 

def main(): 
    user_data = cgi.FieldStorage() 
    if "submit" in user_data: # user press "submit" 
     lecturer = user_data.getfirst("lecturer") 
     f = open("cgi-bin\\w5\\captcha.example\\vote_app\\votes.txt", "a") 
     f.write(lecturer+'\n') 
     f.close() 
     print_response() 
    else: # display the form 
     print_form() 

main() 
+1

Как вы его протестировали, чтобы определить, что он работает в моем браузере? Другими словами, как вы выполняете ** POST ** операцию? Используя браузер, я предполагаю, что у вас есть другая страница с формой, которая отправляется на этот URL? –

+0

@WesleyBaugh Как я проверяю это, перейдя по адресу http: // localhost: 8000/cgi-bin/w5/captcha.example/vote_app/gullible_app.py, который он отображает в соответствии с нормальным – nebffa

+1

Это не POST, хотя выполняет операцию GET. –

ответ

1

Программа на стороне сервера (которую вы не указали, поэтому мы не можем сказать точно) принимает только запросы GET, а не POST-запросы к указанному URL-адресу.

urllib делает urlopen как POST так, как вы это сделали. См. Docs http://docs.python.org/2/library/urllib.html#examples для примера того, как сделать запрос GET

+0

Привет, это было очень важно, когда я пытаюсь получить запрос вручную в браузере, он работает.Как ни странно, когда я делаю то, что вы предложили, и отправляйте запрос GET через urllib (используя строку EXACT SAME, которая работает в веб-браузере), я получаю ошибку 404: «Ничто не соответствует указанному URI». Я даже скопировал и вставил эту ссылку в urllib.urlopen (здесь идет строка), чтобы убедиться, что она работает над тем же. – nebffa

+0

Хорошо, я смог исправить это. Так или иначе, использование модуля запросов и выполнение request.get с тем же URL-адресом решает проблему. Я не знаю, почему это происходит, но это так. Большое спасибо за предложение Vorsprung – nebffa

0

Ответ, похоже, содержится в документации.

Ваше сообщение об ошибке: Error 501, “Can only POST to CGI scripts”, is output when trying to POST to a non-CGI url.

Большой намек: run the CGI script, instead of serving it as a file, if it guesses it to be a CGI script

Что вам нужно изменить: cgi_directories

Так что, либо положить (Python) CGI скрипт в одном из суб- по умолчанию каталогов или изменить cgi_directories, чтобы «угадать» правильно, что URL-адрес должен быть сценарием CGI.

+0

Дело в том, что я уже модифицировал cgi_directories, чтобы включить ВСЕ подкаталоги cgi-bin через os.walk, которые, как я думал, исправили бы эту проблему. Я прочитал документы – nebffa

+0

И убедитесь, что ваш скрипт выполним: 'chmod + x myscript.cgi' на linux ... – duanev

Смежные вопросы