2012-02-10 2 views
0

Я пытаюсь отправить данные POST из скрипта python в URL-адрес. Вот код:Python POST не работает

def createperson(self,name=None): 
     SERVER_BASE_ADDR = 'http://localhost:8000/' 
     postdata = urllib.urlencode({'name':name}) 
     req = urllib2.Request(SERVER_BASE_ADDR + 'people/add') 
     fd = urllib2.urlopen(req,postdata) 
     return name 

Но это возвращает

HTTPError: HTTP Error 500: INTERNAL SERVER ERROR 

Добавление человека на URL-адрес в порядке. Есть идеи?

EDIT

на стороне сервера использует Джанго декораторы для обработки POST и GET.

@require_http_methods(["GET", "POST"]) 
def add(request): 
     if request.method == "POST": 
      #do stuff with post data 

Не является ли вышеуказанный код на языке python таким же, как отправка формы на html-шаблоне? Если это то же самое, то не должны обрабатывать обработчики таким же образом?

Спасибо

решаемые с помощью:

c = urllib2.build_opener() 
postdata = urllib.urlencode({'name':name}) 
r = c.open(url,postdata) 

другого подхода, но делает работу. Спасибо за все ваши ответы.

+0

Что вы используете для обработки запроса на стороне сервера? Требуется ли для этого косая черта /? Ваш сервер дает вам какие-либо отзывы о том, почему его отказ от запроса? – jdi

ответ

2

Ошибка HTTP 500 означает, что проблема не возникает на клиентском скрипте python, но на стороне сервера.

Проверьте код на стороне сервера, возможно, он считывает данные только с GET, а не с POST.

+0

Пожалуйста, просмотрите изменения в вопросе. У меня есть декораторы django для обработки запросов POST и GET. – Neeran

+0

Извините, я довольно новичок в django, но предлагаю вам распечатать (или записать) опубликованные данные. Если данные успешно отправлены, то это должен быть код на стороне сервера. – adamsmith

2

Ошибки HTTP 500, безусловно, являются внутренними ошибками сервера. Проблема возникает на сервере, как отметил @dlutxx.

Чтобы отладить это дальше, я думаю, вам следует изучить обработчик Django. Если он действительно работает для запросов GET, но не POST-запросов, возможно, вам стоит посмотреть, что отличается между обработчиком GET и обработчиком POST.

import logging 

logger = logging.getLogger(__name__) 

@require_http_methods(["GET", "POST"]) 
def add(request): 
    try: 
     if request.method == "POST": 
      # Something is probably broken here. 
     elif request.method == "GET": 
      # But apparently works fine here. 
    except: 
     # Why don't we insert some debugging output to try to catch it. 
     logger.exception("Problem in add handler") 
     raise 

отредактирован использовать рамки протоколирования Python (в Django docs) вместо стандартного вывода.

+0

Он дает 500 внутренних ошибок сервера, прежде чем даже поражает код сервера. Я поставил код выше, но я просто получаю [10/Feb/2012 16:00:00] «POST/people/add HTTP/1.1» 500 57486 на сервере – Neeran

+0

Мой демонстрационный код отправил трассировку на stdout, который ваш Django сервер, вероятно, не записывался для журналов. Вместо этого попробуйте использовать протокол (отредактировал мой ответ). – mattbornski

+0

Нет, независимо от того, где я помещаю логгер на скрипт на стороне сервера, он даже не доходит до него, пока не появится ошибка сервера 500. – Neeran