2016-12-23 4 views
5

私たちは、プロジェクトを通して散らかっているリクエストライブラリの使い方を持っています。最近では、トランザクションの途中で凍結してしまった接続先のバグに遭遇し、接続を開いたままにすることに決めました。要求のタイムアウト設定をグローバルに上書きする方法はありますか?

もちろん、私たちのアプリケーションはスーツに従っています。

タイムアウトを設定する環境変数などがありますか?たとえそれが重要であっても(例えば、30秒)、1つのサービスのために作品全体が停止するのを止めるのに十分なはずです。可能であれば、私は毎回の使用を見つける必要がなく、人々が将来それを追加することを忘れることができないように、グローバルでなければなりません。

答えて

5

残念ながら、コードを見ると、グローバルなデフォルト値を設定することはできません。私はそれがかなり一般的な使用事例であると予想しているので、ちょっと驚いていました。機能リクエストを開始する場合は、お知らせください(この投稿へのコメントなど)。

その理由は、get(...)ような方法、post(...)などは(requests.get(...)がちょうど単一の要求のために、新しいワンショットセッションを作成)Session.request(...)方法上のすべてのちょうど薄いラッパーであることです。このメソッドは引数としてtimeoutをとり、タイムアウト引数がない場合にはSession内部の値を検査しないため、his answerで提案されている2psのように、常に手動で値を設定する必要があります。

源:

  • requests/__init__.pyからrequests.get(...)様ユーティリティ
  • requests.api提供するために、スコープをパッケージ化するインポートAPI - 上記の点にインポートされたAPIモジュール。 usessワンショット・セッション
  • requests.sessions - Session実装
0

あなたは確かにtimeoutパラメータで呼び出しごとにそれを行うことができます。

requests.get('http://www.google.com', timeout=10) 

timeoutパラメータは秒数または(接続タイムアウト、TIMOUTを読む)ためのタプルを指定します。それについての詳細はhereです。

これをグローバルにしたい場合は、すべての呼び出しをラッパークラスにリファクタリングし、全員がこのAPIエンドポイントを呼び出すためにラッパークラスを使用していることを確認するのが最も簡単な方法です。私は要求のコードを素早くチェックし、デフォルトの動作はデータを待つことなのでタイムアウトのためのグローバルなオーバーライドの使用を見ませんでした。

+0

nah、 'counter = 1; try:request.get( 'http://www.google.com'、timeout = 5);ただし、counter + = 1; if counter> My_limit:Nevermind() ' – dsgdfg

0

代わりにrequests.Sessionクラスを継承し、request関数をこのように書き直すことができます。

HTTP_TIMEOUT = 30 

class TimeoutRequestsSession(requests.Session): 
    def request(self, *args, **kwargs): 
     if kwargs.get('timeout') is None: 
      kwargs['timeout'] = HTTP_TIMEOUT 
     return super(TimeoutRequestsSession, self).request(*args, **kwargs) 

session = TimeoutRequestsSession() 
session.get('https://www.google.com') # connection timeout is default 30s 
+0

この提案では、毎回の使用を見つける必要があり、何らかの形で将来人々がそれを忘れないようにします。それは本当に私の質問に答えるものではありません。 – Shadow

+0

簡単にする。あなたはこのようにすることができます。 'requests = TimeoutRequestsSession(); requests.get(...) ' – codeskyblue

関連する問題