23

Railsを使用すると、数行のコードでコンソールでHTTPリクエストをシミュレートできることを学びました。

チェックアウト: http: //37signals.com/svn/posts/3176-three-quick-rails-console-tips(セクション「アプリに飛び込む」)。

Djangoでそれを行う同様の方法はありますか?便利でしょう。

4

3 に答える 3

43

を使用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"}).
于 2016-07-26T17:44:13.000 に答える
20

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 
于 2012-08-01T10:06:21.910 に答える
5

(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)
于 2014-09-26T17:15:34.887 に答える