python - 使用 Python 的 web.py 处理 POST 请求

标签 python python-2.7 rest httprequest web.py

我有一个非常简单的服务器。我使用 Python 2.7 和 web.py。

基本上,我的代码如下所示:

urls = ("/endpoint", "Endpoint")

class Endpoint(object):
    def GET(self):
        return "End point"
    def POST(self):
        data = web.data()
        web.header('Content-Type', 'application/json')
        result = json.loads(data)
        logging.info("[Server] Endpoint POST with payload: " + json.dumps(result))
        return "Endpoint POST"

我通过发出如下 POST 请求来测试该服务器:

echo '{"field": "test"}' | curl -d @- http://my.ip.number:port/endpoint

我尝试了服务器发出 POST 请求的其他方法。我还尝试从终端和浏览器发出获取请求。

在所有情况下,我都会遇到这个非常奇怪的错误。

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/application.py", line 239, in process
    return self.handle()
  File "/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/application.py", line 229, in handle
    fn, args = self._match(self.mapping, web.ctx.path)
  File "/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/application.py", line 427, in _match
    for pat, what in mapping:
ValueError: need more than 1 value to unpack

为什么会发生此错误?我可以采取什么措施来防止它?

谢谢!

编辑1:

显示回溯后,我也得到了这个:

192.168.46.1:51390 - - [16/Mar/2016 12:54:08] "HTTP/1.1 GET /favicon.ico" - 500 Internal Server Error

IP 和端口都不是我正在使用的。

编辑2

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Unicode
from __future__ import unicode_literals

import sys
reload(sys)
# -----

# Logging
import logging
logging.basicConfig(level=logging.INFO)
# -----

# Libs
import web
import json
# -----

urls = ("/", "Index",
        "/endpoint1", "EP1"
        "/endpoint2", "EP2")

class Index(object):
    # In the browser, this displays "Index", but also causes the error on the server side.
    def GET(self):
        return "Index"
    # Doesn't do anything, but causes the error
    def POST(self):
        data = web.data()
        web.header('Content-Type', 'application/json')
        result = json.loads(data)

        logging.info("[Server] Index " + json.dumps(result))
        return "Index POST"

class EP1(object):
    def GET(self):
        return "EP1"
    def POST(self):
        data = web.data()
        web.header('Content-Type', 'application/json')
        result = json.loads(data)

        logging.info("[Server] EP1 " + json.dumps(result))
        return "EP1 POST"


class EP2(object):
    def GET(self):
        return "EP2"
    def POST(self):
        data = web.data()
        web.header('Content-Type', 'application/json')
        result = json.loads(data)

        logging.info("[Server] EP2 " + json.dumps(result))
        return "EP2 POST"

if __name__ == "__main__":
    logging.info("[Server] Starting server.")
    app = web.application(urls, globals())
    app.run()

这就是我的服务器的样子。

我像这样启动服务器:

python server.py 0.0.0.0:7331

如果我从浏览器访问服务器的根端点,我会得到“Index”,但错误仍然发生。其他两个端点不返回任何内容并导致错误。

最佳答案

这里第二行缺少一个逗号:

urls = ("/", "Index",
        "/endpoint1", "EP1"
        "/endpoint2", "EP2")

应该是这样的:

urls = ("/", "Index",
        "/endpoint1", "EP1",
        "/endpoint2", "EP2")

如果没有逗号,Python 会连接两个字符串,中间没有逗号。

因此,对于您的代码,urls 实际上是

("/", "Index", "/endpoint1", "EP1/endpoint2", "EP2")

关于python - 使用 Python 的 web.py 处理 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36035646/

相关文章:

python - SQLAlchemy "too many clients already"错误

python - 快速计算 python 中数组的每个元素的特征向量

python - 使用 for 和 while 循环创建数组 - Python 2

rest - 尝试启动嵌入式 Elasticsearch 节点时不支持 http.type [netty3]

python - 在 heroku 上使用 flask 提供静态 html 页面

python - 错误代码 : UnboundLocalError on line 10

python - 如果值位于另一个数据帧中,如何从一个数据帧获取行

mysql - 结合日期和时间来创建时间序列的索引

rest - Jersey WebResource 的 PathParam

c# - 如何将 http header 值传递给 WCF 休息服务操作?