python - urllib python3中的POST请求
问题描述
我在使用 urllib 库向我的烧瓶服务器发送 POST 请求时遇到问题。我服务器中的所有内容都在使用 Postman 和 Advanced REST Client 进行测试,因此我确信我的服务器没有任何看似明显的错误,但是在使用此代码时出现 500 错误。我已经尝试了很多堆栈溢出帖子和那里列出的答案,但还没有找到可行的解决方案。
通常,服务器拥有的是 /name/add 的路由,它接受一个 POST 请求来接收要添加到全局列表的名称,而 /names 返回一个字典,其值作为字符串名称列表。只是真的很难过,因为它在邮递员和 ARC 上都可以正常工作:(
pkt = parse.urlencode({'name':'Hayden'}).encode('ascii')
req = request.Request('http://127.0.0.1:5000/name/add', pkt)
with request.urlopen(req) as response:
print(response.read())
服务器代码如下:
APP = Flask(__name__)
NAMES = []
@APP.route("/name/add", methods=['POST'])
def add_name():
'''
Adds a new name to the NAMES list
'''
data = request.get_json()
NAMES.append(data['name'])
return {}
@APP.route("/names", methods=['GET'])
def ret_names():
'''
Displays the NAMES list
'''
return dumps({
'name':str(NAMES)
})
@APP.route("/name/remove", methods=['DELETE'])
def rm_name():
'''
Removes a name from the NAMES list
'''
data = request.get_json()
NAMES.remove(data['name'])
return {}
if __name__ == "__main__":
APP.run(port=5000)
错误信息如下:
Traceback (most recent call last):
File "/import/reed/3/z5265106/.local/lib/python3.7/site-packages/flask/app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "/import/reed/3/z5265106/.local/lib/python3.7/site-packages/flask/app.py", line 1951, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/import/reed/3/z5265106/.local/lib/python3.7/site-packages/flask/app.py", line 1820, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/import/reed/3/z5265106/.local/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/import/reed/3/z5265106/.local/lib/python3.7/site-packages/flask/app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "/import/reed/3/z5265106/.local/lib/python3.7/site-packages/flask/app.py", line 1935, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "simple.py", line 18, in add_name
NAMES.append(data['name'])
TypeError: 'NoneType' object is not subscriptable
解决方案
试试这段代码,看看它是否有效:
import urllib.parse
import urllib.request
url = 'http://127.0.0.1:5000/name/add'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
values = {'name' : 'Hayden' }
headers = { 'User-Agent' : user_agent }
data = urllib.parse.urlencode(values)
req = urllib.request.Request(url, data, headers)
response = urllib.request.urlopen(req)
the_page = response.read()
另外,看看这个链接
请考虑将您的代码放入 Try/Catch 中,以便您查看问题所在
try: urllib.request.urlopen(req)
except urllib.error.URLError as e:
print(e.reason)
为了使用您的 GET 方法,请尝试以下操作:
import urllib.request
contents = urllib.request.urlopen("http://127.0.0.1:5000/names").read()
推荐阅读
- reactjs - 反应国际常量
正在给出 [object object] 作为结果 - go - 多行中的多个返回值
- gradle - gradle:仅当文件时间戳早于最新源代码时间戳时如何运行任务
- python - Python中的模式匹配 - 从文件中提取和存储字符串
- mysql - 如何使用spring boot从属性文件中获取静态最终属性
- java - 通过返回语句的布尔值重构/循环
- android - 我可以从我的 apk 中删除哪个 libopencv_java3.so?
- c++ - 如何将值从套接字保存到变量 C++
- aem - 从 AEM 父页面继承标签到子页面
- python - 如何在 django rest swagger 中隐藏一些 API?