Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.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
urllib python3中的POST请求_Python_Post_Flask_Urllib - Fatal编程技术网

urllib python3中的POST请求

urllib python3中的POST请求,python,post,flask,urllib,Python,Post,Flask,Urllib,使用urllib库向flask服务器发送POST请求时遇到问题。我的服务器中的所有内容都已经使用Postman和Advanced REST Client进行了测试,所以我很自信我的服务器没有任何明显的错误,但是在使用这段代码时,我得到了500个错误。 我已经尝试了很多堆栈溢出帖子和上面列出的答案,但是还没有找到一个有效的解决方案 通常,服务器具有/name/add的路由,它接受POST请求以接收要添加到全局列表的名称,而/names返回一个字典,其值为字符串名称列表。我真的很困惑,因为这一切在邮

使用urllib库向flask服务器发送POST请求时遇到问题。我的服务器中的所有内容都已经使用Postman和Advanced REST Client进行了测试,所以我很自信我的服务器没有任何明显的错误,但是在使用这段代码时,我得到了500个错误。 我已经尝试了很多堆栈溢出帖子和上面列出的答案,但是还没有找到一个有效的解决方案
通常,服务器具有/name/add的路由,它接受POST请求以接收要添加到全局列表的名称,而/names返回一个字典,其值为字符串名称列表。我真的很困惑,因为这一切在邮递员和ARC上都非常好:(

pkt=parse.urlencode({'name':'Hayden'}).encode('ascii'))
req=请求。请求('http://127.0.0.1:5000/name/add",pkt)
以request.urlopen(req)作为响应:
打印(response.read())
服务器代码如下所示:

APP=Flask(\uuuuu name\uuuuuu)
名称=[]
@APP.route(“/name/add”,methods=['POST']))
def add_name():
'''
将新名称添加到“名称”列表中
'''
data=request.get_json()
NAMES.append(数据['name'])
返回{}
@APP.route(“/names”,方法=['GET']))
def ret_名称():
'''
显示名称列表
'''
返回转储({
“名称”:str(名称)
})
@APP.route(“/name/remove”,methods=['DELETE']))
def rm_name():
'''
从“名称”列表中删除名称
'''
data=request.get_json()
名称。删除(数据['name'])
返回{}
如果名称=“\uuuuu main\uuuuuuuu”:
应用程序运行(端口=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()
还有,看看这个

请考虑把你的代码放在一个TIG/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()

在服务器代码中,您正在使用
.get_json()
读取请求,如果数据类型与json不匹配,则返回
Nothing
。Nothing类型与您在没有“
名称
”访问的情况下得到的错误相匹配。有关get_json()的更多文档,请参见此处

因此,为了解决您的问题,您可以用json.dumps()替换前面的urlencode函数来序列化请求的数据。记住保留.encode()以确保以字节而不是字符串的形式发送请求

import urllib.parse
import urllib.request
import json

pkt = json.dumps({'name':'Hayden'}).encode('utf-8')
req = urllib.request.Request('http://127.0.0.1:5000/name/add', pkt, method='POST')
with urllib.request.urlopen(req) as response:
  print(response.read())

通常情况下,服务器会提供帮助,并返回一个包含500个错误的错误文本,该错误描述了出错的原因。请尝试打印整个响应,这可能有助于调试this@pastaleg嘿,对不起,应该早点把它贴出来,放在nowHmm中,所以服务器告诉我们,
数据
不是字典。你能试着删除
.encode吗('ascii')
您在客户机中拥有的?关键是请求。请求函数需要数据为字节:(如果我删除它,它不会与服务器联系,相反,我从测试文件中得到一个错误,说TypeError:POST数据应该是字节、字节的iterable或文件对象。它不能是str.Aha类型,然后使用更标准的
.encode(“utf-8”)
来保留字典的结构Hi-Erfan,这对我不起作用:(你认为我的服务器端可能有问题吗?你好,Aniket,请确保你的服务器返回一个有效的JSON响应,这样它就不会是非类型的,Python就可以识别它。我相信是的,但我可能弄错了。我已经在帖子中添加了我的服务器代码,如果这有助于调试的话。我真的认为应该是这样,但仍然是g。)在使用json.dumps后,从服务器上设置相同的错误:(嗯,并且您在Request()中也包含了方法='POST'?是的,我添加了方法='POST'@AniketChavan。要尝试的另一件事是在服务器代码中使用。get_json(force=True)来强制进行json转换