web-dev-qa-db-ja.com

Djangoテストクライアントメソッドオーバーライドヘッダー

ビューセットで更新メソッドをテストしようとしています。ビューセットは、drfから取得したモデルビューセットです。更新するには、プットリクエストを送信する必要があります。これは常にサポートされているわけではないため、プットリクエストを行っていることをサーバーに伝える方法は2つあります。最初の方法は、追加のフィールドを使用して_methodというフォームを作成し、それをput。 jsonデータを投稿する必要があるため、X-HTTP-Method-Overrideヘッダーを使用する2番目の方法を使用する必要があります。

テストケースにデータを投稿するには、次のコードを使用します。

header = {'X_HTTP_METHOD_OVERRIDE': 'PUT'}
response = client.post('/model/1/', content_type='application/json', data=post_data_clean, **header)

しかし、残念ながら、私が得た結果は{'detail':'Method POST not allowed.'}です。アドオン( Postman )を使用してサーバーの動作をテストしました。ここで、X-HTTP-Method-Overrideヘッダーも指定しました。例外は発生しません。ヘッダーをDjangoテストクライアントに正しく渡す方法を知る必要があります。そうしないと、テストがここで非常に煩わしくなります。

17
Iwan1993

ヘッダーを'HTTP_X_HTTP_METHOD_OVERRIDE'ではなく'X_HTTP_METHOD_OVERRIDE'として指定する必要があります。つまり、ヘッダーの先頭にHTTP_を追加します。

header = {'HTTP_X_HTTP_METHOD_OVERRIDE': 'PUT'}
response = client.post('/model/1/', content_type='application/json', data=post_data_clean, **header)

Djangoドキュメント: から

リクエストのHTTPヘッダーは、すべての文字を大文字に変換し、ハイフンをアンダースコアに置き換え、名前にHTTP_プレフィックスを追加することで、METAキーに変換されます。したがって、たとえば、X-BenderというヘッダーはMETAキーHTTP_X_BENDERにマップされます。

34
Rahul Gupta

また、クライアントのコンストラクターにヘッダーを渡すこともできます。

from Django.test import Client

client = Client(HTTP_USER_AGENT="Mozilla/5.0 ...", HTTP_X_USER_ID="982734")

このように、すべてのリクエストにはデフォルトのヘッダーが含まれます。

[〜#〜] ps [〜#〜]:このアプローチは、DRFTestApiClientおよびApiRequestFactoryに有効です。

0
username