gpt4 book ai didi

python - 如何在 CherryPy 中设置 CORS

转载 作者:行者123 更新时间:2023-12-01 07:26:32 26 4
gpt4 key购买 nike

概述

当从我的网站向运行 CherryPy 的 Python 服务器创建发布请求时,我收到错误 对 XMLHttpRequest 的访问已被 CORS 策略阻止:Access-Control-Allow 不允许请求 header 字段内容类型- 预检响应中的 header 。 .我能够使用“CORS Everywhere”浏览器扩展之一暂时解决这个问题,但是

  1. 由于最近的更新,这些扩展程序尚未更新以再次运行。
  2. 所涉及的网站最终需要在没有浏览器扩展的情况下被我本地综合体中的许多人使用,因此一旦扩展更新,无论哪种方式都并不重要,因为我不能依赖这些扩展,并强制每个人使用它们(当显然有一个修复程序可以使扩展变得不必要时)。我认为解决方案可能已经过时,但我不确定。

相关代码如下:

在服务器端(CherryPy/Python):

从网站发布请求调用 CherryPy Python 函数

@cherrypy.expose
@cherrypy.tools.json_in()
def add_meeting(self):
data = None
id = None
start_time = None
end_time = None
title = None
userlist = None
result = {"operation": "request", "result": "success"}
if cherrypy.request.method == "POST":
data = cherrypy.request.json
id = data["id"]
start_time = data["start_time"]
end_time = data["end_time"]
title = data["title"]
userlist = data["userlist"]

# Rest of relevant code in function is left out, to take up less
# space and not post irrelevant code. That being said, I am
# positive the logic is correct, as it originally ran smoothly
# with a "Cors Everywhere" Browser Extension.

return result

这是我设置和运行 CherryPy 的区域

def main():
# Create the configuration file parser object and start the CherryPy server
config = ConfigParser.ConfigParser()
config.read(CONFIG_FILE)
port = config.getint('Meta', 'port')
host = config.get('Meta', 'host')
cherrypy.config.update({'server.socket_port': port,
'server.socket_host': host,
'tools.CORS.on': True})
cherrypy.quickstart(Coordinator(config))
main()

这是上面代码中提到的配置文件(CONFIG_FILE)

[Meta]
host = 0.0.0.0
port = 3000


# Rest is left out, as it is irrelevant with problem

我尝试实现的解决方案

  1. 在主函数上方包含以下函数:
def CORS():
cherrypy.response.headers["Access-Control-Allow-Origin"] = "*"


与cherrypy.tools.CORS =cherrypy.Tool('before_handler', CORS)

2. 在上面的cherrypy.config.update中添加“'cors.expose.on': True ”
3.使用我在网上找到的cherrypy-cors Python库:https://pypi.org/project/cherrypy-cors/
4. Python 文件的 config.update 部分包含 header
5. 在“def add_meeting”之前添加“@cherrypy.tools.accept(media='application/json')”

结论

我已经分别尝试了上述解决方案,其中一些解决方案有或没有其他解决方案,但我仍然陷入困境。也许其中一些解决方案是部分正确的,并且我的代码还需要一些额外的东西。我不知道;我就是无法让它发挥作用。在此之前我没有太多的网络开发经验,所以也许(并且希望)解决方案非常简单。我知道代码是有效的,但如果没有为每个用户提供有效的“Cors Everywhere”浏览器扩展,我就无法让它运行。

至于我正在运行的版本:我使用的是 CherryPy 14.2.0 和 Python 2.7.6

任何帮助对我来说都意味着绝对的世界,谢谢。

最佳答案

因此,首先,您需要在处理 OPTIONS 请求时设置飞行前 header ,您可以在那里列出允许的方法。然后,您还需要启用 cors.expose 工具。

有一些使用提示in the docstring of cherrypy-cors 。例如,当 using a MethodDispatcher ,您可以使用 @cherrypy_cors.tools.preflight() 修饰 OPTIONS 处理程序方法,而不是在每个 HTTP 处理程序中执行此操作。

这是一个简单的遍历示例(没有方法调度程序)。要测试它,请访问 http://127.0.0.1/它将针对 http://localhost:3333/add_meeting 提出请求就 CORS 而言,这是不同的 Origin('localhost' != '127.0.0.1')。

"""Example of CORS setup using cherrypy-cors library."""

import cherrypy
import cherrypy_cors


# Python 2 compat: make all classes new-style by default
__metaclass__ = type # pylint: disable=invalid-name


class WebRoot:
"""Root node for HTTP handlers."""

@cherrypy.expose
def index(self): # pylint: disable=no-self-use
"""Render a web page handling request against ``/``.

Contains client JS snippet which will query the API endpoint.
It will be executed by the browser while loading the page.
"""
return """<html>
<script type="text/javascript">
async function addMeeting() {
/*
* Example coroutine for querying /add_meeing
* HTTP endpoint. It uses localhost as in the URL.
* For testing CORS, make sure to visit
* http://127.0.0.1/ which is a different origin
* from browser's perspective.
* /
const request_payload = {
some: 'data',
listed: ['h', 'er', 'e'],
}
try {
const resp = await fetch(
'http://localhost:3333/add_meeting',
{
method: 'POST',
mode: 'cors', // Required for customizing HTTP request headers
credentials: 'same-origin',
headers: {
'Content-Type': 'application/json; charset=UTF-8', // Required for ``cherrypy.tools.json_in`` to identify JSON payload and parse it automatically
},
body: JSON.stringify(request_payload),
},
)
const json_resp = await resp.json()
console.log(json_resp) // Will print: {"method": "POST", "payload": {"listed": ["h", "er", "e"], "some": "data"}}
} catch (e) {
console.warn('Exception: ' + e)
}
}

async function main() {
await addMeeting()
}

main() // Entry point
</script>
</html>""" # noqa: E501

@cherrypy.expose
@cherrypy.tools.json_in() # turn HTTP payload into an object; also checking the Content-Type header
@cherrypy.tools.json_out() # turn ``return``ed Python object into a JSON string; also setting corresponding Content-Type
def add_meeting(self):
"""Handle HTTP requests against ``/add_meeting`` URI."""
if cherrypy.request.method == 'OPTIONS':
# This is a request that browser sends in CORS prior to
# sending a real request.

# Set up extra headers for a pre-flight OPTIONS request.
cherrypy_cors.preflight(allowed_methods=['GET', 'POST'])

if cherrypy.request.method == 'POST':
return {'method': 'POST', 'payload': cherrypy.request.json}

return {'method': 'non-POST'}


def main():
"""Set up and run the web app.

Initializes CORS tools.
Sets up web server socket.
Enables the CORS tool.
"""
cherrypy_cors.install()
cherrypy.config.update({
'server.socket_host': '127.0.0.1',
'server.socket_port': 3333,
'cors.expose.on': True,
})
cherrypy.quickstart(WebRoot())


__name__ == '__main__' and main() # pylint: disable=expression-not-assigned

关于python - 如何在 CherryPy 中设置 CORS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57416237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com