2017-02-15 4 views
0

私は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) 

これまでのところとても良いです。私はsessionidcsrftokenクッキーとの応答を取得します。それから私はものを行うために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で完全に動作します。したがって、いくつかのヘッダーがありません。なぜなら、数が多くないからです。ちょうどHostUser-Agent、およびSet-Cookieです。

私は意図的にDjangoとstdlib以外のモジュールの使用を避けようとしています。認証はむしろ単純ではありませんか?

答えて

0

Set-Cookieが、結果として要求に対して間違ったヘッダであるように思われました。代わりにCookieを使用する必要があります。

>>> get = Request('http://127.0.0.1:8000/api/do-stuff') 
>>> get.add_header('Cookie', 'csrftoken=53eX5pwRzV4fR...') # just csrftoken here 
>>> get_resp = urlopen(get) 
1

urllibの代わりにDjangoのテストクライアントを使用してみてください。

>>> from django.test import Client 
>>> c = Client() 
>>> response = c.post('/login/', {'username': 'john', 'password': 'smith'}) 
>>> response.status_code 
200 
>>> response = c.get('/customer/details/') 
>>> response.content 
b'<!DOCTYPE html...' 

参照してください:documentation

+0

これは非常に有望です。私は 'Client'をスタンドアローンパッケージ(Djangoの残りの部分なし)として出荷できますか?それは生産に適していますか? – Vovanrock2002

+0

申し訳ありません...私はそれをスタンドアロンパッケージとして使用しようとしたことはありません...そしておそらく、テストプロセスでのみ使用するべきです。 – awmleer

関連する問題