我正在尝试将Cuttle Proxy与Django一起使用,以限制应用程序对Shopify API的调用的速率。
我已经将Cuttle部署到一个盒子中并且正在运行。问题是,我不确定如何指定CACERT以使SSL在Django端保持满意。
Cuttle建议您这样创建证书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_PROXY,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。有任何想法吗?
最佳答案
我知道这并不能直接回答您的问题,但是我们最终在ShopifyConnection
模块中使用了猴子修补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的Leaky Bucket算法。您也可以简单地使用sleep(0.5)
,它也应该可以正常工作。您需要将其放入文件中(我们称为
shopify_limiter.py
),将其放在主应用程序的目录中,然后将其导入该应用程序的__init__.py
中,以确保已加载。关于python - 在Django中指定SSL CACERT以通过Cuttle Proxy运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37423668/