2016-05-24 13 views
0

Cuttle ProxyをDjangoで使用しようとすると、私たちのアプリがShopify APIに対して行う呼び出しをレート制限します。DjangoでSSL CACERTを指定してCuttle Proxyを実行

私はボックスにカッテージを展開して実行しています。問題は、私はDGangoの終わりにSSLを喜ばせるためにCACERTをどのように指定するのか分かりません。

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

を私は上記の実行中のジャンゴを行うだろう方法:

カトルは、あなたがそうのようなあなたのHTTPクライアントでそれを使用し、その後

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

など

として証明書を作成し、提案します?私は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を使用しているようです。何か案は?

答えて

0

これはあなたの質問に直接答えるものではありませんが、ShopifyConnectionshopifyモジュール内では、速度制限ロジックを挿入するほうがはるかに簡単な方法で行くことになりました。

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に読み込んで読み込まれるようにします。

関連する問題