Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过Python请求/URL模块将JSON消息从同一路由器/LAN上的Pizero W发送到Pi Django服务器?_Json_Django_Python 3.x_Raspberry Pi - Fatal编程技术网

如何通过Python请求/URL模块将JSON消息从同一路由器/LAN上的Pizero W发送到Pi Django服务器?

如何通过Python请求/URL模块将JSON消息从同一路由器/LAN上的Pizero W发送到Pi Django服务器?,json,django,python-3.x,raspberry-pi,Json,Django,Python 3.x,Raspberry Pi,我有一个Raspberry Pi 3+和一个Raspberry Pizero W连接到同一个家庭无线网络 Pi 3+正在托管Django服务器,Pi 3+的IP地址在家庭网络上是静态的,地址为192.384.5.767 Pizero W在家庭网络上有一个静态IP地址192.384.5.343 当我从Pizero W ping Pi 3+服务器时,我可以看到它已启动: pi@PIZEROW:~$ ping 192.384.5.767 64 bytes from 192.384.5.767: icm

我有一个Raspberry Pi 3+和一个Raspberry Pizero W连接到同一个家庭无线网络

Pi 3+正在托管Django服务器,Pi 3+的IP地址在家庭网络上是静态的,地址为
192.384.5.767

Pizero W在家庭网络上有一个静态IP地址
192.384.5.343

当我从Pizero W ping Pi 3+服务器时,我可以看到它已启动:

pi@PIZEROW:~$ ping 192.384.5.767
64 bytes from 192.384.5.767: icmp_seq=1 ttl=64 time=10.5 ms
64 bytes from 192.384.5.767: icmp_seq=2 ttl=64 time=30.0 ms
64 bytes from 192.384.5.767: icmp_seq=3 ttl=64 time=32.1 ms
此外,当我在平板电脑上访问Django服务器托管的网站时,没有任何问题

但是,我需要Pizero W和Django服务器之间的双向通信,因此我想测试从Pizero W向PI3+服务器发送一条超级简单的JSON消息,并从服务器接收到消息的确认。我不需要服务器对消息执行任何操作,只需要接收消息、放弃消息并发送确认消息已收到

我试着从Pizero W使用以下方法进行此操作:

pi@PIZEROW:~$ python3
>>> import requests
>>> import JSON
>>> url = "http://192.384.5.767:8000"
>>> data = {'msg':'test'}
>>> r = requests.post(url, data)
并收到以下错误:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 159, in _new_conn
    (self._dns_host, self.port), self.timeout, **extra_kw)
  File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 80, in create_connection
    raise err
  File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 70, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 354, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/usr/lib/python3.7/http/client.py", line 1229, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/usr/lib/python3.7/http/client.py", line 1275, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.7/http/client.py", line 1224, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.7/http/client.py", line 1016, in _send_output
    self.send(msg)
  File "/usr/lib/python3.7/http/client.py", line 956, in send
    self.connect()
  File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 181, in connect
    conn = self._new_conn()
  File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 168, in _new_conn
    self, "Failed to establish a new connection: %s" % e)
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0xb5a2b610>: Failed to establish a new connection: [Errno 111] Connection refused

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 449, in send
    timeout=timeout
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 638, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 398, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='192.384.5.767', port=8000): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0xb5a2b610>: Failed to establish a new connection: [Errno 111] Connection refused'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/requests/api.py", line 116, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 60, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 533, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 646, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 516, in send
    raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='192.384.5.767', port=8000): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0xb5a2b610>: Failed to establish a new connection: [Errno 111] Connection refused'))
回溯(最近一次呼叫最后一次):
文件“/usr/lib/python3/dist-packages/urllib3/connection.py”,第159行,位于康涅狄格州新城区
(self.\u dns\u主机、self.port)、self.timeout、**额外功率)
文件“/usr/lib/python3/dist packages/urllib3/util/connection.py”,第80行,在create_connection中
提出错误
文件“/usr/lib/python3/dist packages/urllib3/util/connection.py”,第70行,在create_connection中
sock.connect(sa)
ConnectionRefusedError:[Errno 111]连接被拒绝
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“/usr/lib/python3/dist packages/urllib3/connectionpool.py”,第600行,在urlopen中
分块=分块)
文件“/usr/lib/python3/dist packages/urllib3/connectionpool.py”,第354行,在请求中
conn.request(方法,url,**httplib\u request\u kw)
请求中的文件“/usr/lib/python3.7/http/client.py”,第1229行
self.\u发送\u请求(方法、url、正文、标题、编码\u分块)
文件“/usr/lib/python3.7/http/client.py”,第1275行,在发送请求中
self.endheaders(body,encode\u chunked=encode\u chunked)
文件“/usr/lib/python3.7/http/client.py”,第1224行,在endheaders中
self.\u发送\u输出(消息体,encode\u chunked=encode\u chunked)
文件“/usr/lib/python3.7/http/client.py”,第1016行,在发送输出中
self.send(msg)
文件“/usr/lib/python3.7/http/client.py”,第956行,在send中
self.connect()
文件“/usr/lib/python3/dist packages/urllib3/connection.py”,第181行,在connect中
conn=自我。_new_conn()
文件“/usr/lib/python3/dist-packages/urllib3/connection.py”,第168行,位于康涅狄格州的新州
self,“无法建立新连接:%s”%e)
urllib3.exceptions.NewConnectionError::无法建立新连接:[Errno 111]连接被拒绝
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“/usr/lib/python3/dist packages/requests/adapters.py”,第449行,在send中
超时=超时
文件“/usr/lib/python3/dist packages/urllib3/connectionpool.py”,第638行,在urlopen中
_stacktrace=sys.exc_info()[2])
文件“/usr/lib/python3/dist packages/urllib3/util/retry.py”,第398行,增量
引发MaxRetryError(_池、url、错误或响应错误(原因))
urllib3.exceptions.MaxRetryError:HTTPConnectionPool(host='192.384.5.767',port=8000):url://超过了最大重试次数(由NewConnectionError引起(':未能建立新连接:[Errno 111]连接被拒绝])
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python3/dist-packages/requests/api.py”,第116行,在post中
返回请求('post',url,data=data,json=json,**kwargs)
文件“/usr/lib/python3/dist-packages/requests/api.py”,第60行,请求中
return session.request(method=method,url=url,**kwargs)
文件“/usr/lib/python3/dist packages/requests/sessions.py”,请求中的第533行
resp=自我发送(准备,**发送)
文件“/usr/lib/python3/dist packages/requests/sessions.py”,第646行,在send中
r=适配器.send(请求,**kwargs)
文件“/usr/lib/python3/dist packages/requests/adapters.py”,第516行,在send中
raise ConnectionError(e,请求=请求)
requests.exceptions.ConnectionError:HTTPConnectionPool(host='192.384.5.767',port=8000):url://超过最大重试次数(由NewConnectionError引起(':未能建立新连接:[Errno 111]连接被拒绝])
不太清楚到底发生了什么,但似乎尽管Django服务器已经启动并运行,作为我的平板电脑和
ping
成功的证据,我仍然可以从Pizero发送和接收消息


如有任何帮助/建议,将不胜感激!谢谢大家!

这可能是三件事之一:

(1) django服务器未绑定到ip地址或0.0.0.0。通常,
runserver
命令启动django在127.0.0.1或localhost上侦听。要使其绑定到正确的ip地址/端口,请使用

python manage.py 192.384.5.767:8000
在生产环境中,django应用程序通常由gunicorn或uwsgi提供服务,并在端口80上侦听。如果使用gunicorn/uwsgi运行,请更新相应的配置设置

(2) pi上的防火墙正在阻止访问。根据操作系统的不同,您可能需要允许远程访问tcp端口80。根据linux的版本,您可能还必须为apparmor和/或selinux添加规则。例如:

iptables -A INPUT -p tcp --port 80 -j ACCEPT
(3) 最后,使用请求的调用稍微不正确。应该是

requests.post(url, json=data)

我不认为192.384.5.767是真正的ip地址。点之间的数字应该是>=0并且正确,不是真实的IP地址,但这对于这个问题来说并不是必要的,对吧?我的评论不是真实的评论,所以我们放弃了。好的,我