【问题标题】:Workaround for dev_appserver.py inability to make SSL requestsdev_appserver.py 无法发出 SSL 请求的解决方法
【发布时间】:2015-08-31 19:52:24
【问题描述】:

尝试从 Google App Engine 应用调用 braintree.ClientToken.generate() 时遇到了这个问题,在 dev_appserver.py 上运行 Flask。 dev_appserver.py 目前无法进行传出 SSL 连接。进行上述braintree调用会产生

ConnectionError: ('Connection aborted.', error(13, 'Permission denied'))

调用在真实的 GAE 环境中运行。它在我的一个视图中使用,因此当它失败时,它会以上述 500 错误破坏我的整个网站流程。我该如何解决这个问题,以便我可以在本地环境中继续开发?

【问题讨论】:

    标签: python google-app-engine ssl braintree dev-appserver


    【解决方案1】:

    我在布伦特里工作。如果您还有更多问题,可以随时contact our support team

    有关 GAE 上的 Braintree Python 库的帮助,请参阅 this example on my GitHub。要回答您的问题,您可以force the dev server to use the real Python socket library,以便 SSL 连接正常工作:

    try:
        # This is needed to make local development work with SSL.
        # This must be done *before* you import the Braintree Python library.
        # See http://stackoverflow.com/a/24066819/500584
        # and https://code.google.com/p/googleappengine/issues/detail?id=9246 for more information.
        from google.appengine.tools.devappserver2.python import sandbox
        sandbox._WHITE_LIST_C_MODULES += ['_ssl', '_socket']
    
        import sys
        # this is socket.py copied from a standard python install
        import stdlib_socket
        sys.modules['socket'] = stdlib_socket
    except ImportError as e:
        print(e)
    

    【讨论】:

    • 这是对另一个问题的回答(我认为)。如果我理解正确,这将启用与 dev_appserver.py 的传入 SSL 连接,而不是传出连接。我遇到的问题是 dev_appserver 无法进行传出 SSL 连接。当我能找到的所有与我的问题相关的答案就是这个答案时,我感到非常沮丧,当然我试图无济于事,散落在互联网上。
    • @brandones 你错了。此修复程序专门用于启用传出 SSL 连接。
    • 对我不起作用。我也尝试过此修复程序的一些变体。我只是不断收到同样的错误——ConnectionError: ('Connection aborted.', error(13, 'Permission denied'))
    • @brandones 如果您发布了一个最小的代码示例,其中包含我的答案中的修复程序,但仍然对您有问题,我很乐意明天看看,看看我是否可以重现。
    • 原来我在这段代码上方调用了import braintree,所以它没有使用提供的套接字模块。 import braintree 需要在此代码之后 出现。我认为这将是一件好事,因为它肯定不明显。
    【解决方案2】:

    如果您的应用有一些全局变量与您在 dev_appserver.py 中运行时对应,您可以创建一个基于该变量的失败方法的模拟。

    就我而言,该变量称为env_conf.FLASK_CONF。我使用以下代码来模拟 Braintree 生成调用。

    # Imports
    import braintree
    import env_conf
    from flask import render_template
    
    # Mock Braintree in DEV environment
    if env_conf.FLASK_CONF == 'DEV':
        from functools import partial
        def mock_generate(self):
            return 'foobarbaz123'
        braintree.ClientToken.generate = partial(mock_generate, braintree.ClientToken())
    
    # Add payment handler
    def add_payment():
        token = braintree.ClientToken.generate()
        return render_template('add-payment.html',
                               braintree_client_token=token)
    

    这个想法一般是:

    import problem_function
    if DEV_ENVIRONMENT:
        def mock_problem_fcn():
            return 'expected response'
        problem_function = mock_problem_function
    
    problem_function()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 2020-03-16
      相关资源
      最近更新 更多