urllib python3中的POST请求

2024-06-07 23:07:34 发布

您现在位置:Python中文网/ 问答频道 /正文

使用urllib库向flask服务器发送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

Tags: nameinpyimportflasknamesrequestlib
2条回答

在服务器代码中,您正在使用.get_json()读取请求,如果数据类型与json返回不匹配Nothing。nothing类型与您在没有“name”访问权限的情况下得到的错误相匹配。更多关于get_json()的文档,请参见https://flask.palletsprojects.com/en/1.1.x/api/#flask.Request.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())

尝试此代码并查看其是否有效:

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()

还有,看看这个Link

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

相关问题 更多 >

    热门问题