Railsを使用すると、数行のコードでコンソールでHTTPリクエストをシミュレートできることを学びました。
チェックアウト: http: //37signals.com/svn/posts/3176-three-quick-rails-console-tips(セクション「アプリに飛び込む」)。
Djangoでそれを行う同様の方法はありますか?便利でしょう。
Railsを使用すると、数行のコードでコンソールでHTTPリクエストをシミュレートできることを学びました。
チェックアウト: http: //37signals.com/svn/posts/3176-three-quick-rails-console-tips(セクション「アプリに飛び込む」)。
Djangoでそれを行う同様の方法はありますか?便利でしょう。
を使用RequestFactory
できます。
リクエストにユーザーを挿入する
アップロードされたファイルをリクエストに挿入する
特定のパラメータをビューに送信する
requestsを使用する追加の依存関係は必要ありません。
URL とビュー クラスの両方を指定する必要があるため、リクエストを使用するよりも余分なコード行が必要になることに注意してください。
from django.test import RequestFactory
request_factory = RequestFactory()
my_url = '/my_full/url/here' # Replace with your URL -- or use reverse
my_request = request_factory.get(my_url)
response = MyClasBasedView.as_view()(my_request) # Replace with your view
response.render()
print(response)
my_request.user = User.objects.get(id=123)
リクエストのユーザーを設定するには、レスポンスを取得する前に次のようにします。
パラメータをクラスベースのビューに送信するには、次のようにします response = MyClasBasedView.as_view()(my_request, parameter_1, parameter_2)
拡張例
RequestFactory
これらを組み合わせて使用する例を次に示します
HTTP POST ( url url
、機能ビューview
、およびデータ ディクショナリへpost_data
)
単一ファイルのアップロード (パスfile_path
、名前file_name
、およびフォーム フィールド値file_key
)
リクエストにユーザーを割り当てる ( user
)
URL から kwargs 辞書を渡す ( url_kwargs
)
SimpleUploadedFile
フォームに有効な方法でファイルをフォーマットするのに役立ちます。
from django.core.files.uploadedfile import SimpleUploadedFile
from django.test import RequestFactory
request = RequestFactory().post(url, post_data)
with open(file_path, 'rb') as file_ptr:
request.FILES[file_key] = SimpleUploadedFile(file_name, file_ptr.read())
file_ptr.seek(0) # resets the file pointer after the read
if user:
request.user = user
response = view(request, **url_kwargs)
Python シェルから RequestFactory を使用する
RequestFactory
は、デフォルトでサーバーに「testserver」という名前を付けます。これは、テスト コード内で使用していない場合に問題を引き起こす可能性があります。次のようなエラーが表示されます。
DisallowedHost: Invalid HTTP_HOST header: 'testserver'. You may need to add 'testserver' to ALLOWED_HOSTS.
@boatcoder のコメントからのこの回避策は、デフォルトのサーバー名を「localhost」にオーバーライドする方法を示しています。
request_factory = RequestFactory(**{"SERVER_NAME": "localhost", "wsgi.url_scheme":"https"}).
Python コマンドラインからのリクエストをシミュレートする方法は次のとおりです。
リクエストをシミュレートする簡単な方法は次のとおりです。
>>> from django.urls import reverse
>>> import requests
>>> r = requests.get(reverse('app.views.your_view'))
>>> r.text
(prints output)
>>> r.status_code
200
manage.py shell
更新: 必ず、従来の python シェルではなく、django シェルを (経由で) 起動してください。
更新 2: Django <1.10 の場合、最初の行を次のように変更します。
from django.core.urlresolvers import reverse
(tldr; down を参照)
古い質問ですが、誰かが興味を持っている場合に備えて、答えを追加するだけです。
これは最善の方法ではないかもしれませんが(またはDjangoと言いましょう)、物事を行う方法です。しかし、あなたはこの方法を試すことができます。
django シェルの内部
>>> import requests
>>> r = requests.get('your_full_url_here')
説明: 説明reverse()
を
省略しました。reverse()
多かれ少なかれ、views.py 関数に関連付けられた URL を見つけるためreverse()
です。必要に応じて、を省略して、代わりに URL 全体を配置することもできます。
たとえば、django プロジェクトに友達アプリがあり、友達アプリでlist_all()
(views.py 内の) 関数を確認したい場合は、これを行うことができます。
TLDR;
>>> import requests
>>> url = 'http://localhost:8000/friends/list_all'
>>> r = requests.get(url)