私はDjangoアプリケーションを持っていると私は、ユーザーがいくつかのAPI経由でログインし、それらをlogin_required
デコレータで保護されているいくつかのAPI呼び出しを使用することを許可できるようにしたい:Djangoにログインするにはどうしたらいいですか?
@csrf_exempt
def api_login(request):
if request.method == 'POST':
username = request.POST.get('username', '')
password = request.POST.get('password', '')
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
return HttpResponse(status=201)
return HttpResponseBadRequest()
@login_required
def do_stuff(request):
return HttpResponse(status=201)
そして、これは私がログインしよう方法ですPythonシェルからdo_stuff
を呼び出してください:
>>> from urllib.parse import urlencode
>>> from urllib.request import Request, urlopen
>>> post = Request('http://127.0.0.1:8000/api/login', urlencode({'username': 'admin', 'password': 'admin'}).encode())
>>> post_resp = urlopen(post)
これまでのところとても良いです。私はsessionid
とcsrftoken
クッキーとの応答を取得します。それから私はものを行うためにsessionid
クッキーを使用しよう:
>>> get = Request('http://127.0.0.1:8000/api/do-stuff')
>>> get.add_header('Set-Cookie', 'csrftoken=...') # just copy paste of the response cookie
>>> get_resp = urlopen(get)
この時点でlogin_required
デコレータは私がAnonimousUser
だと考えて、ログインページにリダイレクトを送信します。ブラウザはこのsessionid
のCookieで完全に動作します。したがって、いくつかのヘッダーがありません。なぜなら、数が多くないからです。ちょうどHost
、User-Agent
、およびSet-Cookie
です。
私は意図的にDjangoとstdlib以外のモジュールの使用を避けようとしています。認証はむしろ単純ではありませんか?
これは非常に有望です。私は 'Client'をスタンドアローンパッケージ(Djangoの残りの部分なし)として出荷できますか?それは生産に適していますか? – Vovanrock2002
申し訳ありません...私はそれをスタンドアロンパッケージとして使用しようとしたことはありません...そしておそらく、テストプロセスでのみ使用するべきです。 – awmleer