首页 > 解决方案 > 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

标签: pythonpostflaskurllib

解决方案


试试这段代码,看看它是否有效:

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

推荐阅读