短いバージョン: django サイトでは、値を取得できますが、Twilio からの要求に応答することはできrequest.GET
ません。request.POST
csrf と関係があると思われますが、問題をデバッグする方法がよくわかりません。詳細は以下。
長いバージョン: 私は、Twilio REST API を使用して SMS で医療調査を実行しているプロジェクトで友人を支援しています。私はドメインと、そのドメイン上に非常に必要最小限の django で構築されたサイトを持っていました。これは、django に慣れるために構築したものなので、それを使用しています。
調査に対する SMS 応答を収集しています。Twilio API の一部として、番号への応答をアカウントで指定された URL に送信するため、次のような応答をターゲットにしています。
...mydomain.com/some_page/another_page/
Twilio リクエストは次のようになります。
...mydomain.com/some_page/another_page/?AccountSid=###SOME_LONG_ACCOUNT_SIDE&From=%2BPHONE_NUMBER&Body=bla+BLA+bla+BLA&SmsSid=##MESSAGE_ID_KEY&SmsMessageSid=##MESSAGE_ID_KEY&FromCity=Santa+Cruz&FromState=California...
作業コード
私は、着信要求がAccountSid
内部にあることをテストしています (データベースの値と比較して) views.py
。アプリの場合、次のようなものがあります (これは機能します)。
from our_app import TwilioAccount
our_account = TwilioAccount.objects.get(id=1)
def twilio_response(request):
assert request.GET.get('AccountSid', None) == our_account.account_sid
## log the incoming request to the database under survey responses...
動かないコード
Twilio アカウントにログインし、リクエスト メソッドをに切り替えてから、POST
すべてのデータ収集をに切り替えると、上記の assert ステートメントは失敗します。さらにデバッグすると、POST の下で QueryDict が空であることが明らかになったため、取得されたキー値はありません。request.POST
POST: {}
これはおそらくPOST
、django の下で が必要なためcsrf_token
だと思いましたが、AccountSid のチェックはかなり良いと考えたのでcsrf_exempt
、上記の関数をインポートしてラップしました。
@csrf_exempt
def twilio_response(request):
assert request.POST.get('AccountSid', None) == our_account.account_sid
## log the incoming request to the database under survey responses...
AssertionError: ...
これはまったく同じリクエストでは機能しません: QueryDict は空です。
質問:
1) 作品を作るために他に何かする必要はあります@csrf_exempt
か? 別の質問:これはひどくばかげた方法ですか? 実際にログインしているユーザーではなく、他社の API を使用している場合、人々は通常どのようにしてこの要件を満たすのでしょうか?
1a) csrf_exempt にする代わりに、GET
account_sid に対してすべての着信要求を引き続きチェックしていることを知っているので、要求としてそのままにしておくことができます。私はそれを行うべきですか、それとも本当に単純な方法ですか?
2)これを行うための最良の方法を学びたいと思っています.djangoフォームを作成してから、リクエストをフォームにルーティングし、有効性をテストしてデータを消去する必要がありますか?もしそうなら、フォームのテンプレートがない場合に、ビュー/フォームがどのように見えるか (csrf_token で完成) について大まかな概要を誰か教えてもらえますか?