2016-07-27 3 views
0

У меня есть два компьютера в одной сети, и я пытаюсь передать файл от одного к другому с помощью python (в контексте более крупного проекта).Загрузка файла с сервера python на сервер

На стороне сервера У меня есть следующий сценарий: бутылка

import bottle 
import json 

@bottle.hook('after_request') 
def enable_cors(): 
    """ 
    You need to add some headers to each request. 
    Don't use the wildcard '*' for Access-Control-Allow-Origin in production. 
    """ 
    bottle.response.headers['Access-Control-Allow-Origin'] = '*' 
    bottle.response.headers['Access-Control-Allow-Methods'] = 'PUT, GET, POST, DELETE, OPTIONS' 
    bottle.response.headers['Access-Control-Allow-Headers'] = 'Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token' 

# LANDING (IT IS NOT REALLY NEEDED JUST TO CHECK STUFF) 
@bottle.route('/', method='GET') 
def root(): 
    return { 
     'api': 'api/' 
    } 

@bottle.route('/api', method='POST') 
def upload(): 
    upload = bottle.request.files.get('file') 
    print upload.filename 
    upload.save('input.txt') 

if __name__ == '__main__': 
    bottle.run(host='0.0.0.0', port=8080, debug=True) 

На стороне клиента Я пытаюсь отправить файл через библиотеку запроса, такие как:

import sys 
import requests 

r = requests.post('http://ip:port/api/', files={'file': open(sys.argv[1], 'rb')}) 
print r 

(ip и порт соответствует его соответствующим значениям).

Я получаю эту ошибку, о которой я не уверен, как обращаться.

Traceback (most recent call last): 
    File "loopmatch.py", line 4, in <module> 
    r = requests.post('http://ip:port/api/', files={'file': open(sys.argv[1], 'rb')}) 
    File "/usr/local/lib/python2.7/site-packages/requests/api.py", line 111, in post 
    return request('post', url, data=data, json=json, **kwargs) 
    File "/usr/local/lib/python2.7/site-packages/requests/api.py", line 57, in request 
    return session.request(method=method, url=url, **kwargs) 
    File "/usr/local/lib/python2.7/site-packages/requests/sessions.py", line 475, in request 
    resp = self.send(prep, **send_kwargs) 
    File "/usr/local/lib/python2.7/site-packages/requests/sessions.py", line 585, in send 
    r = adapter.send(request, **kwargs) 
    File "/usr/local/lib/python2.7/site-packages/requests/adapters.py", line 453, in send 
    raise ConnectionError(err, request=request) 
requests.exceptions.ConnectionError: ('Connection aborted.', error(32, 'Broken pipe')) 

Любая помощь будет очень признательна.
Спасибо!

+1

Я не вижу никаких проблем там ... Является ли определенная работа ... Вы работаете за прокси? Попробуйте очистить pyc и закройте pid, если необходимо, и убедитесь, что порт ip, который вы запускаете, свободен до запуска ... –

+0

Все выглядит хорошо по этому поводу. Маршрут * root * был настроен так, чтобы иметь возможность оценить эти проблемы. Я видел, что было ошибкой. Но спасибо за ваш ответ! – jaumebonet

ответ

0

Итак ... вещь довольно глупо ... Просто оставить ответ здесь, в случае, если кто-то топает с этой глупой ошибки ...

В bottle.route и requests.url необходимо соответствовать точно. В мае случае маршрут был api в то время как URL был api/ ... вот почему они не работали ...

Нужно двигаться как к api/ или api.

+1

Прохладный. FYI причина, по которой они должны точно совпадать, состоит в том, что пути '/ api' и'/api/'являются * разными * в соответствии с спецификацией HTTP. Если рассматривать их как эквивалентные, это будет серьезной проблемой для бутылок или любых веб-фреймворков. –

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