在Django中指定sslcacert以通过Cuttle代理运行

2024-04-19 15:30:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将Cuttle Proxy与Django结合使用,以限制应用程序对shopifyapi的调用。你知道吗

我已经把卡特尔部署到一个盒子里,它正在运行。问题是,我不确定如何指定一个CACERT来让Django端的SSL保持愉快。你知道吗

卡特尔建议您创建一个这样的证书

openssl req -x509 -nodes -sha1 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825

然后将其与http客户端一起使用,如下所示:

https_proxy='127.0.0.1:3128' curl --cacert cacert.pem https://www.example.com/api/

运行Django时,我将如何执行上述操作?如果我指定HTTPS\u代理

HTTPS_PROXY='cuttle.mydomain.com:3128' python manage.py runserver

我得到以下错误:

<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)>

shopify Python API使用pyactiveresource。如果pyactiveresource使用的是requests库,那么可以很容易地指定它,但它似乎使用的是urllib.Requests。有什么想法吗?你知道吗


Tags: djangohttpscom应用程序ssl部署pem盒子
1条回答
网友
1楼 · 发布于 2024-04-19 15:30:21

我知道这并不能直接回答你的问题,但我们最终还是在shopify模块中使用了更简单的猴子补丁^{}来插入速率限制逻辑。以下是基本的脚手架:

from pyactiveresource.activeresource import formats
from pyactiveresource.connection     import Connection, ConnectionError

class RateLimitedShopifyConnection(Connection, object):
    response = None

    def __init__(self, site, user=None, password=None, timeout=None,
                 format=formats.JSONFormat):
        super(ShopifyConnection, self).__init__(
            site, user, password,timeout, format
        )

    def rate_limit(self):
        # Blocking logic here

    def _open(self, *args, **kwargs):
        self.response = None
        try:
            self.rate_limit()
            self.response = super(RateLimitedShopifyConnection, self)._open(
                *args, **kwargs
            )
        except pyactiveresource.connection.ConnectionError as err:
            self.response = err.response
            raise
        return self.response

# Monkey patch
import shopify
shopify.base.ShopifyConnection = RateLimitedShopifyConnection

您可以使用self.site获取用户的域作为唯一标识符。在我们的设置中,我们使用内存数据库Redis来实现一个交叉请求令牌桶算法,它完美地补充了Shopify的漏桶算法。您也可以简单地使用sleep(0.5),这样也可以。你知道吗

你需要把它放在一个文件中(我们称之为shopify_limiter.py),把它放在你的主应用程序的目录中,然后把它导入到那个应用程序的__init__.py,以确保它被加载。你知道吗

相关问题 更多 >