当前位置: 首页 > 面试题库 >

415例外Cherrypy Web服务

云锦
2023-03-14
问题内容

我正在尝试构建Cherrypy / Python
Web服务。我已经花费了一整天的时间来研究如何使跨域Ajax请求成为可能。终于可以了,但是现在我有下一个问题。我想我已经知道了解决方案,但是我不知道如何实现。问题是,当我发送ajax请求时,Cherrypy服务器将响应:

415 Unsupported Media Type

Expected an entity of content type application/json, text/javascript

Traceback (most recent call last):  File "/Library/Python/2.7/site-packages/cherrypy/_cprequest.py", line 663, in respond    self.body.process()  File "/Library/Python/2.7/site-packages/cherrypy/_cpreqbody.py", line 996, in process    super(RequestBody, self).process()  File "/Library/Python/2.7/site-packages/cherrypy/_cpreqbody.py", line 538, in process    self.default_proc()  File "/Library/Python/2.7/site-packages/cherrypy/_cperror.py", line 411, in __call__    raise selfHTTPError: (415, u'Expected an entity of content type application/json, text/javascript')

我找到并尝试测试的解决方案是将以下行添加到配置中:

'tools.json_in.force': False

所以我尝试在以下代码中实现它:

import cherrypy
import json
import sys

class RelatedDocuments:

def index(self):
    return "Hello World!"

@cherrypy.tools.json_out()
@cherrypy.tools.json_in()
def findRelated(self, **raw):
    #Get JSON message form request
    request = cherrypy.request.json
    result = []

    #SOME CODE...

    return result;

# Expose the index method through the web. CherryPy will never
# publish methods that don't have the exposed attribute set to True.
index.exposed = True
findRelated.exposed = True

def CORS():
    cherrypy.response.headers["Access-Control-Allow-Origin"] = "*"

import os.path
tutconf = os.path.join(os.path.dirname(__file__), 'webserver.conf')
config = {
    'global': {
        'server.socket_host':'127.0.0.1',
        'server.socket_port': 8080,
        'log.error_file' : 'Web.log',
        'log.access_file' : 'Access.log'
    },
    '/': {
        'tools.CORS.on': True
    }
}

if __name__ == '__main__':
    cherrypy.tools.CORS = cherrypy.Tool('before_finalize', CORS)

    cherrypy.quickstart(RelatedDocuments(),config=config)

我在tools.CORS.on行下添加了config行,但这没有用。接下来我尝试了这个:

cherrypy.config.update({
    'tools.json_in.force': False,
});

没成功。.next我试图在findRelated方法上方实现此功能:

@cherrypy.config(**{'tools.json_in.force': False})

所有的实现给我一个500错误,如果有人可以帮助我,我非常感谢。提前致谢!


问题答案:

我已经意识到问题实际上是关于 CORS的飞行前请求 。CORS 规范为简单的CORS请求定义了以下条件:

  • 方法:GETHEADPOST
  • 头:AcceptAccept-LanguageContent-LanguageContent-Type
  • 教改尝试型头值:application/x-www-form-urlencodedmultipart/form-datatext/plain

否则,CORS请求并不简单,请在实际请求之前使用预检OPTIONS请求,以确保其符合要求。这是CORS的最佳做法。

因此,如果您想保持简单,则可能需要恢复正常状态application/x-www-form- urlencoded。否则,您需要正确处理预检请求。这是工作示例(不要忘记添加localhost别名)。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Add localhost alias, `proxy` , in /etc/hosts.
'''


import cherrypy


config = {
  'global' : {
    'server.socket_host' : '127.0.0.1',
    'server.socket_port' : 8080,
    'server.thread_pool' : 8
  }
}


def cors():
  if cherrypy.request.method == 'OPTIONS':
    # preflign request 
    # see http://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0
    cherrypy.response.headers['Access-Control-Allow-Methods'] = 'POST'
    cherrypy.response.headers['Access-Control-Allow-Headers'] = 'content-type'
    cherrypy.response.headers['Access-Control-Allow-Origin']  = '*'
    # tell CherryPy no avoid normal handler
    return True
  else:
    cherrypy.response.headers['Access-Control-Allow-Origin'] = '*'

cherrypy.tools.cors = cherrypy._cptools.HandlerTool(cors)


class App:

  @cherrypy.expose
  def index(self):
    return '''<!DOCTYPE html>
      <html>
      <head>
      <meta content='text/html; charset=utf-8' http-equiv='content-type'>
      <title>CORS AJAX JSON request</title>
      <script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js'></script>
      <script type='text/javascript'>
        $(document).ready(function()
        {
          $('button').on('click', function()
          {
            $.ajax({
              'type'        : 'POST',
              'dataType'    : 'JSON',
              'contentType' : 'application/json',
              'url'         : 'http://proxy:8080/endpoint',
              'data'        : JSON.stringify({'foo': 'bar'}),
              'success'     : function(response)
              {
                console.log(response);  
              }
            });
          })
        });
      </script>
      </head>
      <body>
        <button>make request</button>
      </body>
      </html>
    '''

  @cherrypy.expose
  @cherrypy.config(**{'tools.cors.on': True})
  @cherrypy.tools.json_in()
  @cherrypy.tools.json_out()
  def endpoint(self):
    data = cherrypy.request.json
    return data.items()


if __name__ == '__main__':
  cherrypy.quickstart(App(), '/', config)


 类似资料:
  • 这是我向Spotify发出身份验证请求的脚本,但它返回错误。我尝试更改内容类型,但这似乎并没有削减它。这是我的代码:

  • 通过start.spring.io创建了一个Spring应用程序,我试图运行该应用程序,但出现错误: org.springframework.context.应用程序上下文异常:无法启动Web服务器;嵌套异常java.lang.IllegalStateExctive: Temp目录'C:\WINDOWS\TEMP'不存在org.springframework.boot.web.servlet.co

  • 问题内容: 我决定将日志记录系统添加到我的gwt服务层。首先,我想记录从该层引发的所有异常。我有一个类似于Spring的ServletDispatcher的对象,该对象调用其他服务。我以为可以在其中添加日志记录,但是我意识到GWT服务将已检查的异常包装在ServletResponse中,并将未检查的包装为UnexpectedException。 有人可以分享他在这个问题上的经验吗?记录所有GWT服

  • 我目前正在从事一个部署在Glassfish服务器上的项目。当出现异常时,我可以很容易地在Glassfish日志上看到堆栈跟踪。然而,有时当存在与持久性相关的问题(例如关系注释或延迟加载)时,服务器的响应是HTTP 500内部服务器错误,在任何日志文件中都没有任何异常。在没有任何关于实际错误的线索的情况下修补、粗暴地强制执行错误需要花费大量时间。有没有办法启用详细模式以便我可以看到这个异常,或者这是

  • 问题内容: 设计可能引发异常的单例类的最佳方法是什么? 在这里,我有一个Singleton(使用Bill Pugh的方法,在Wiki中为Singleton记录)。 如果在2处引发异常,我想将其传播给调用方。但是,我不能从第1行引发异常。 因此,如果单例对象创建不正确,我唯一的选择是返回空对象吗? 谢谢 PS我确实意识到,如果该Singleton通过不同的类加载器加载或反射加载,则可能会损坏,但是对

  • 我对Java应用程序相当陌生。我正在尝试在eclipse中运行这个开源应用程序。我已经逐一包含了所需的所有外部库,并删除了所有错误。现在,当我运行应用程序时,我在运行时遇到异常。控制台中的消息如下所示: 现在,我可以看出,slf4j日志库是一个例外。我曾尝试在“配置构建路径”的外部jar部分中包含不同版本的slf4j,但我得到了相同的例外。所以我认为slf4j的版本控制不是这里的问题。此外,在异常