ディレクトリ
第VII章、Ajangoは認証モジュールが来ます
まず、認証は何ですか
Djangoの認証は組み込みのユーザ認証モジュールです
当社は、ユーザーのシステムを実現するためにウェブサイトを設計する必然的な必要性を、サイトを開発しています。私たちには、実装する必要がある。この時点で、用户注册、用户登录、用户认证、注销、修改密码
他の機能を、これは本当に厄介なことであるん
究極の完璧主義者のための枠組みとして、Djangoは、当然のことながら、これらの痛みのポイントのユーザーを考えます。これは、強力なユーザ認証システムを構築しました- auth
それは、デフォルトのauth_user
テーブルをユーザデータを格納します。
二、認証モジュールの一般的な方法
まず、インポートモジュール
from django.contrib import auth
authenticate()
login(HttpRequest, user)
logout(request)
is_authenticated()
login_requierd()
create_user()
create_superuser()
check_password(password)
set_password(password)
認証する()
それは通常取る、ユーザー名とパスワードが正しいことを確認してください
username 、password
2つのキーワード引数を。()認証ユーザがユーザを認証した識別するために、オブジェクトの後端にプロパティを設定し、それ以降の処理において、ログイン情報が必要です。
user = authenticate(username='usernamer',password='password')
ログイン(HttpRequestの、ユーザー)
この関数は、とり
HttpRequest
を通じてオブジェクトだけでなく、認定をUser
オブジェクト。from django.contrib.auth import authenticate, login def my_view(request): username = request.POST['username'] password = request.POST['password'] user = authenticate(username=username, password=password)#校验密码不等于登录 if user is not None: #判断user是否存在 存在就能获取 login(request, user)#登录 本质上给后端为这个user 生成session数据 #登陆成功后返回一个sucess的page ... else: # 返回一个user不存在的page ...
ログアウト(リクエスト)
HttpRequestオブジェクト、ノーリターン値を受け取るために着陸がログオフする必要があります。
この関数が呼び出されると、現在の要求は、セッションをクリアします。ユーザーがログインしていない場合であっても、また文句はありません。この機能を使用しています。
from django.contrib.auth import logout def logout_view(request): logout(request) # Redirect to a success page.
is_authenticated()
現在の要求が認定するかどうかを判断するために使用します。
def my_view(request): if not request.user.is_authenticated(): return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path)) #不通过验证的user会重定向到登录界面 else: ...#返回验证通过后跳转到的页面
login_requierd()
認証は、ビューにチェックを追加する簡単なログインのための装飾的なツールを提供してくれます。
from django.contrib.auth.decorators import login_required @login_required def my_view(request): ...
説明:
ユーザーがログインしていない場合は、DjangoのデフォルトのログインURLにジャンプします
'/accounts/login/ '
し、(成功した着陸した後、パスにリダイレクトされます)絶対パスにアクセスするために現在のURLを渡します。あなたはログインする必要があり、URLをカスタマイズする必要があるsettings.py
ファイルを介しては、LOGIN_URL
変更されます。例えば、LOGIN_URL = '/login/'
ここにルーティングするために、プロジェクトのログインページを設定しユーザーを作成()
新しいユーザ認証オファーを作成する方法は、必要なパラメータを提供する必要がある
(username、password)
ようにしています。from django.contrib.auth.models import User user = User.objects.create_user(username='用户名',password='密码',email='邮箱',...)
create_superuser()
新しいスーパーユーザーの認証を作成すると、必要なパラメータを提供する方法を提供します
(username、password)
from django.contrib.auth.models import User user = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)
check_password(パスワード)
パスワード認証のオファーかどうかを確認する正しい方法は、現在のリクエストのユーザーのパスワードを提供する必要があります。パスワードが正しいリターン真、そうでなければFalseです。
is_ok = user.check_password('密码') #密码正确is_ok返回True,否则返回False。
set_password(パスワード)
AUTHによって提供されたパスワードを変更する方法は、パラメータとして設定される新しいパスワードを受け取りました。
注意:ユーザーオブジェクトの保存メソッドを呼び出してください設定した後!!!
user.set_password(password='') user.save() #设置完一定要调用用户对象的save方法!!!
単純なパスワードの変更ケース
@login_required def set_password(request): user = request.user err_msg = '' if request.method == 'POST': old_password = request.POST.get('old_password', '') new_password = request.POST.get('new_password', '') repeat_password = request.POST.get('repeat_password', '') # 检查旧密码是否正确 if user.check_password(old_password): if not new_password: err_msg = '新密码不能为空' elif new_password != repeat_password: err_msg = '两次密码不一致' else: user.set_password(new_password) user.save() return redirect("/login/") else: err_msg = '原密码输入错误' content = { 'err_msg': err_msg, } return render(request, 'set_password.html', content)
プロパティユーザーオブジェクト
ユーザーオブジェクトのプロパティ:ユーザー名、パスワード
is_staff:ユーザーがサイトの管理者権限を持っているかどうか。
is_active:Falseに設定されたユーザのログインを許可するかどうかは、ユーザーの構内を削除せずにログインからユーザーを停止することができます。
第三に、デフォルトのテーブルAUTH_USERを拡大
これは非常に使いやすい認証システムを内蔵したが、AUTH_USERテーブルのフィールドは、それらのいくつかを固定している、私はああプロジェクトに直接持ち込むことはできません!
例えば、私は店の電話番号へのユーザー追加するphone
フィールドを、どのようにしますか?
スマート新しいテーブルを考えると、その後一から一によって別のものと内蔵のテーブルAUTH_USER協会、これは要件を満たすことができますが、それを達成するためには良い方法はありませんこと?
答えはではもちろんです。
私たちは、組み込みの継承することができAbstractUser
、独自のモデルクラスを定義するクラスを。
これは、プロジェクトの設計柔軟なユーザテーブルのニーズに応じていないだけで、Djangoは強力な認証システムを使用することができます。
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
"""
用户信息表
"""
id = models.AutoField(primary_key=True)
phone = models.CharField(max_length=11, null=True, unique=True)
def __str__(self):
return self.username
データ移行コマンドを実行することを忘れてはいけないmigrate
とmakemigrations
注意:
道によるテーブルの上のビルトインAUTH_USERの拡大した後、必ずsettings.py
、私は今、私の新しく定義された使用Djangoに教えてUserInfo
ユーザー認証を行うためのテーブルを。次のように言葉を選びました:
# 引用Django自带的User表,继承使用时需要设置
AUTH_USER_MODEL = "app名.UserInfo"
再び注意:
私たちが使用するテーブルに新しい認証システムを指定すると、我々は、データベース内のテーブルを再作成する必要がありますが、テーブルAUTH_USER元のデフォルトを継続して使用することはできません。