サーチ…


前書き

HTTP POSTメソッドとそれに対応するRequests関数のコンテキストでのPython Requestsモジュールのドキュメント

シンプルポスト

from requests import post

foo = post('http://httpbin.org/post', data = {'key':'value'})

単純なHTTP POST操作を実行します。投稿されたデータはほとんどの形式になりますが、キーの値のペアが最も一般的です。

ヘッダー

ヘッダーを表示することができます。

print(foo.headers)

応答例:

{'Content-Length': '439', 'X-Processed-Time': '0.000802993774414', 'X-Powered-By': 'Flask', 'Server': 'meinheld/0.6.1', 'Connection': 'keep-alive', 'Via': '1.1 vegur', 'Access-Control-Allow-Credentials': 'true', 'Date': 'Sun, 21 May 2017 20:56:05 GMT', 'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json'}

投稿前にヘッダーを作成することもできます。

headers = {'Cache-Control':'max-age=0',
        'Upgrade-Insecure-Requests':'1',
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36',
        'Content-Type':'application/x-www-form-urlencoded',
        'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Referer':'https://www.groupon.com/signup',
        'Accept-Encoding':'gzip, deflate, br',
        'Accept-Language':'es-ES,es;q=0.8'
        }

 foo = post('http://httpbin.org/post', headers=headers, data = {'key':'value'})

エンコーディング

エンコーディングは、ほぼ同じ方法で設定および表示できます。

 print(foo.encoding)

'utf-8'

foo.encoding = 'ISO-8859-1'

SSL検証

要求は、デフォルトでドメインのSSL証明書を検証します。これはオーバーライドすることができます:

foo = post('http://httpbin.org/post', data = {'key':'value'}, verify=False)

リダイレクション

任意のリダイレクトに従います(httpからhttpsなど)。これも変更できます:

foo = post('http://httpbin.org/post', data = {'key':'value'}, allow_redirects=False)

ポスト操作がリダイレクトされた場合、この値にアクセスできます。

print(foo.url) 

リダイレクトの完全な履歴を見ることができます:

print(foo.history) 

フォームエンコードデータ

from requests import post

payload = {'key1' : 'value1',
           'key2' : 'value2'
           }

foo = post('http://httpbin.org/post', data=payload)

ポスト操作でフォームエンコードされたデータを渡すには、データを辞書として構造化し、データパラメータとして指定する必要があります。

データがエンコードされていないようにするには、文字列または整数をdataパラメータに渡します。

データを自動的にフォーマットするリクエストのjsonパラメータに辞書を渡します:

from requests import post

payload = {'key1' : 'value1', 'key2' : 'value2'}

foo = post('http://httpbin.org/post', json=payload)

ファイルアップロード

Requestsモジュールでは、 .read()取り出されたコンテンツとは対照的にファイルハンドルを提供するだけでよい。

from requests import post

files = {'file' : open('data.txt', 'rb')}

foo = post('http://http.org/post', files=files)

Filename、content_type、およびヘッダーも設定できます:

files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}

foo = requests.post('http://httpbin.org/post', files=files)

文字列は、 filesパラメータとして指定されている限り、ファイルとして送信することもfilesます。

複数のファイル

1つのファイルと同じように複数のファイルを提供することができます。

multiple_files = [
    ('images', ('foo.png', open('foo.png', 'rb'), 'image/png')),
    ('images', ('bar.png', open('bar.png', 'rb'), 'image/png'))]

foo = post('http://httpbin.org/post', files=multiple_files)

反応

レスポンスコードは、ポスト操作から表示できます。

from requests import post

foo = post('http://httpbin.org/post', data={'data' : 'value'})
print(foo.status_code)

返されたデータ

返されるデータへのアクセス:

foo = post('http://httpbin.org/post', data={'data' : 'value'})
print(foo.text)

生の回答

基になるurllib3のresponse.HTTPResponseオブジェクトにアクセスする必要がある場合は、次のようにして行うことができます。

foo = post('http://httpbin.org/post', data={'data' : 'value'})
res = foo.raw

print(res.read())

認証

シンプルなHTTP認証

シンプルなHTTP認証は、次の方法で実現できます。

from requests import post

foo = post('http://natas0.natas.labs.overthewire.org', auth=('natas0', 'natas0'))

これは技術的には以下の点では短所です。

from requests import post
from requests.auth import HTTPBasicAuth

foo = post('http://natas0.natas.labs.overthewire.org', auth=HTTPBasicAuth('natas0', 'natas0'))

HTTPダイジェスト認証

HTTPダイジェスト認証は非常によく似た方法で行われますが、Requestsはこれに対して別のオブジェクトを提供します。

from requests import post
from requests.auth import HTTPDigestAuth

foo = post('http://natas0.natas.labs.overthewire.org', auth=HTTPDigestAuth('natas0', 'natas0'))

カスタム認証

組み込みの認証メカニズムが十分でない場合もありますが、この例を想像してみてください。

送信者が正しいユーザーエージェント文字列と特定のヘッダー値を持ち、HTTP基本認証によって正しい資格情報を提供する場合、サーバーは認証を受け入れるように構成されています。これを実現するには、カスタム認証クラスを用意し、Requests認証実装のベースとなるAuthBaseをサブクラス化する必要があります。

from requests.auth import AuthBase
from requests.auth import _basic_auth_str
from requests._internal_utils import to_native_string

class CustomAuth(AuthBase):

    def __init__(self, secret_header, user_agent , username, password):
        # setup any auth-related data here
        self.secret_header =  secret_header
        self.user_agent = user_agent
        self.username = username
        self.password = password

    def __call__(self, r):
        # modify and return the request
        r.headers['X-Secret'] = self.secret_header
        r.headers['User-Agent'] = self.user_agent
        r.headers['Authorization'] = _basic_auth_str(self.username, self.password)
        
        return r

これは、次のコードで利用できます。

foo = get('http://test.com/admin', auth=CustomAuth('SecretHeader', 'CustomUserAgent', 'user', 'password' ))

プロキシ

各要求POST操作は、ネットワークプロキシを使用するように構成できます

HTTP / Sプロキシ

from requests import post

proxies = {
  'http': 'http://192.168.0.128:3128',
  'https': 'http://192.168.0.127:1080',
   }

foo = requests.post('http://httpbin.org/post', proxies=proxies)

HTTP基本認証は次のように提供されます。

proxies = {'http': 'http://user:[email protected]:312'}
foo = requests.post('http://httpbin.org/post', proxies=proxies)

SOCKSプロキシ

ソックスプロキシを使用するには、一度インストールされたソックスプロキシがHTTPBasicAuthと非常によく似た方法で使用されると、サードパーティの依存関係requests[socks]が必要です。

proxies = {
'http': 'socks5://user:pass@host:port',
'https': 'socks5://user:pass@host:port'
}

foo = requests.post('http://httpbin.org/post', proxies=proxies)


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow