Stackoverflow の全知全能の皆様へ
Django 1.3 では、URL からトークンを取得し、(正しい場合) ユーザーをログインさせ、URL からトークンを削除する process_request ミドルウェアを作成しています。でも:
I) Django は、ミドルウェアで POST/GET データにアクセスしないことを推奨していますが、その理由がよくわかりません... request.path にも同じことが当てはまりますか? https://docs.djangoproject.com/en/dev/topics/http/middleware/#process-view
II) URL からトークンを削除したいので、/album3/pic42/~53Cr3t70K3n/like/
-> /album3/pic42/like/
. ただし、request.path を変更しても機能しません。ページは見つかりませんが、
ミドルウェアは正しく処理します (印刷で検証)
直接入力
/album3/pic42/like/
しても機能しますエラー(トークン付き)が表示されます
Request URL: http://www.site.com/album3/pic42/like/
これに対する修正はありますか、それとも完全に間違った角度からアプローチしていますか?
前もって感謝します!
クライアント側で変更するには、明らかにリダイレクトが必要であることに気づきました(なぜそれを考えなかったのですか...)。ただし、たとえばパーソナライズされた画像にアクセスする場合など、新しいリクエストなしでサーバー側だけで書き換えることができると便利です。
Ps: 必要に応じて詳細を読み飛ばしてください
私は、パーソナライズされた電子メールをユーザーに送信する (送信する) サイトに取り組んでいます。ユーザーが電子メール内のリンクをクリックして、電子メール リンク内のトークンを使用して自動的にログインできるようにしたいと考えています。これは、通常のログインに追加されます。(人々が電子メールを転送する可能性があるため、安全性が低いことはわかっていますが、私のサイトには十分です)。URL は次のようになります: /album3/pic42/~53Cr3t70K3n/like/ ( http://www.site.comを削除すると、Django がそれを行います)
これに一致し、必要に応じてユーザーをログインさせるミドルウェア、トークンを有効な資格情報として受け入れるための認証バックエンド、およびトークン モデルを作成しています。
ミドルウェア process_request 関数: def process_request(self, request):
if '/~' in request.path:
result = re.search('(.*)/~(.+?)/(.*)', request.path)
(uidb36, token) = result.group(2).split('-', 2)
user = authenticate(uidb36 = uidb36, token = token)
if user: login(request, user)
return HttpResponseRedirect('%s/%s' % (result.group(1), result.group(3)) + ('?' + '&'.join('='.join(item) for item in request.GET.items()) if request.GET else ''))
return None
現在、リダイレクトで動作していますが、内部でも実行できるようにしたいと考えています。