当前位置: 首页 > 知识库问答 >
问题:

如何在樱桃皮中设置 CORS

东郭兴学
2023-03-14

当从我的网站向运行CherryPy的Python服务器创建发布请求时,我收到错误对XMLHttpRequest的访问已被CORS策略阻止:请求头字段内容类型不被飞行前响应中的访问控制允许头允许.我可以用一个“CORS Everywhere”浏览器扩展暂时解决这个问题,但是

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

以下是相关代码:

从网站post请求调用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"] = "*"


用樱桃汤。CORS=樱桃味。工具('before_handler',CORS)

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

我已经分别尝试了上面的解决方案,有些有,有些没有,但我仍然卡住了。也许这些解决方案中的一些是部分正确的,我的代码需要一些额外的东西。我不确定;我就是无法让它工作。在此之前,我没有太多的Web开发经验,所以也许(希望)解决方案非常简单。我知道代码是有效的,我只是无法让它运行,如果没有为每个用户提供一个有效的“Cors到处”浏览器扩展。

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

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

共有1个答案

宰修能
2023-03-14

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

在< code>cherrypy-cors的docstring中有一些用法提示。例如,当使用< code>MethodDispatcher时,您可以用< code > @ cherrypy _ CORS . tools . preflight()来修饰< code>OPTIONS处理程序方法,而不是在每个HTTP处理程序中都这样做。

下面是一个简单的遍历示例(没有方法调度程序)。要测试它,请访问 http://127.0.0.1/,它将针对 http://localhost:3333/add_meeting 发出请求,就 CORS 而言,这是一个不同的“本地主机”!= '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
 类似资料:
  • 使用lodash es,我们可以挑选如下模块:

  • 我注意到,当我在JVM 7和JVM 8上运行JavaFX应用程序时,我得到了不同的默认外观。如何将每个JVM上的默认皮肤设置为相同?

  • 点击各播放器的编辑按钮,进入具体播放器编辑页面。 播放器编辑页面 基础类、展示类可编辑设置项如下图所示: 项目 基础类播放器 展示类播放器 皮肤外观 5款 2款 LOGO √ √ 缓冲片头 √ √ 右侧菜单-系统 默认开启 默认关闭 右侧菜单-自定义 √ √ 综合功能-面板自动隐藏 √ - 综合功能-分享设置 √ √ 播放列表 √ √ 域名限制 √ √ 视频推荐 √ √ 1)设置播放器皮肤 进入具

  • 问题内容: 我正在尝试使用JavaFX中的WebView入门,但是当尝试打开W​​ebView时,我收到以下所示的错误,我该如何解决此问题? 问题答案: 尝试运行WebView时遇到任何错误时,请确保您的VM选项包含模块javafx.web。 虚拟机选项: 在IntelliJ中,您可以通过转到IDE右上方的“编辑配置”按钮来访问VM选项。

  • 问题内容: 我已经使用数据库中的SQL数据库开发了一个窗口服务,该数据库中的记录已满,因此查询执行需要很多时间,而默认命令超时是30S,但我想将其增加到120S。 但是我的应用程序中有很多方法,因此我想从APP.config文件中进行设置,这样它将适用于应用程序级别,任何人都可以告诉我如何实现此目标 谢谢 问题答案: 实现此目的的最简单方法是在类似以下内容的地方添加新条目: 然后,创建一个将填充值

  • 问题内容: 我有一个模型: 如何编写基于类的视图,该视图创建新的模型实例并将外键设置为? 问题答案: 我通过覆盖方法解决了这个问题。下面是详细说明的样式: 但是我们可以简短地说(感谢dowjones123),在docs中提到了这种情况。