ディレクトリ
1認証モジュールとは何ですか
Djangoの認証モジュールが内蔵されているユーザ認証モジュール:
当社は、ユーザーのシステムを実現するためにウェブサイトを設計する必然的な必要性を、サイトを開発しています。我々は、ユーザ登録、ユーザのログイン、ユーザ認証を含め、達成ログオフし、パスワードやその他の機能を変更する必要があり、この時点では、これは本当にまだ面倒なことです。
Djangoは究極の完璧主義者のためのフレームワークとして、もちろん、また、これらの痛みのポイントのユーザーを考えます。これは、ユーザーデータを格納するテーブルをAUTH_USERするための強力なユーザ認証システム--auth、デフォルトを建てました。
2認証モジュールの一般的な方法
from django.contrib import auth
認証する()
つまり、ユーザー名とパスワードが正しいことを確認するために、ユーザ認証機能を提供し、それは通常、ユーザー名、パスワード二つの重要なパラメータを取ります。
認証は(有効なユーザー名とパスワードが正しい)に成功した場合、それはユーザーオブジェクトを返します。
()認証ユーザがユーザを認証した識別するために、オブジェクトの後端にプロパティを設定し、それ以降の処理において、ログイン情報が必要です。
使用法:
user = authenticate(username='usernamer',password='password')
ログイン(HttpRequestの、ユーザー)
この関数は、HttpRequestを対象と認定され、ユーザーオブジェクトを受け取ります。
この機能は、ユーザーのログイン機能を実装しています。本質的には、後端部にユーザーのセッション関連のデータを生成します。
使用法:
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:
login(request, user)
# Redirect to a success page.
...
else:
# Return an 'invalid login' error message.
...
ログアウト(リクエスト)
この関数は、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))
login_requierd()
認証は、ビューにチェックを追加する簡単なログインのための装飾的なツールを提供してくれます。
使用法:
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
...
ユーザーがログインしていない場合は、DjangoのデフォルトのログインURLにジャンプ「/アカウント/ログイン/」と(成功着陸した後、パスにリダイレクトされます)絶対パスにアクセスするには、現在のURLを渡します。
あなたは、ログインURLをカスタマイズしたい場合は、settings.pyファイルにLOGIN_URLによって変更する必要があります。
例:
LOGIN_URL = '/login/' # 这里配置成你项目登录页面的路由
ユーザーを作成()
新しいユーザ認証オファーを作成する方法、そうで必要なパラメータ(ユーザ名、パスワード)とを提供することが必要です。
使用法:
from django.contrib.auth.models import User
user = User.objects.create_user(username='用户名',password='密码',email='邮箱',...)
create_superuser()
新しいスーパーユーザーの認証を作成すると、その上で必要なパラメータ(ユーザ名、パスワード)とを提供する方法を提供します。
使用法:
from django.contrib.auth.models import User
user = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)
check_password(パスワード)
パスワード認証のオファーかどうかを確認する正しい方法は、現在のリクエストのユーザーのパスワードを提供する必要があります。
パスワードが正しいリターン真、そうでなければFalseです。
使用法:
ok = user.check_password('密码')
set_password(パスワード)
AUTHによって提供されたパスワードを変更する方法は、パラメータとして設定される新しいパスワードを受け取りました。
注意:ユーザーオブジェクトの保存メソッドを呼び出してください設定した後!!!
使用法:
user.set_password(password='')
user.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に設定されたユーザのログインを許可するかどうかは、ユーザーの構内を削除せずにログインからユーザーを停止することができます。
表3は、デフォルトのAUTH_USERを拡張します
これは非常に使いやすい認証システムを内蔵したが、AUTH_USERテーブルのフィールドは、それらのいくつかを固定している、私はああプロジェクトに直接持ち込むことはできません!
例えば、私は何をするか、ユーザーの携帯電話番号を格納するフィールドを追加したいですか?
スマート新しいテーブルを考えると、その後一から一によって別のものと内蔵のテーブルAUTH_USER協会、これは要件を満たすことができますが、それを達成するためには良い方法はありませんこと?
答えはではもちろんです。
私たちは、独自のモデルクラスを定義するには、組み込みのAbstractUserクラスを継承することができます。
これは、プロジェクトの設計柔軟なユーザテーブルのニーズに応じていないだけで、Djangoは強力な認証システムを使用することができます。
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
"""
用户信息表
"""
nid = models.AutoField(primary_key=True)
phone = models.CharField(max_length=11, null=True, unique=True)
def __str__(self):
return self.username
注意:
内蔵のテーブルの上のAUTH_USERによって拡大した後、settings.pyでDjangoに伝えるようにしてください、私は今、私は、ユーザー認証を行い、新たに定義されたUserInfoテーブルを使用します。次のように言葉を選びました:
# 引用Django自带的User表,继承使用时需要设置
AUTH_USER_MODEL = "app名.UserInfo"
再び注意:
私たちが使用するテーブルに新しい認証システムを指定すると、我々は、データベース内のテーブルを再作成する必要がありますが、テーブルAUTH_USER元のデフォルトを継続して使用することはできません。
プラグイン可能なデザイン
import settings
import importlib
def send_all(content):
for module_path in settings.NOTIFY_LIST:
module, class_name = module_path.rsplit('.',maxsplit=1)
# module = 'notify.email' class_name = 'Email'
mod = importlib.import_module(module) # mod就是模块名
# from notify import email
cls = getattr(mod,class_name) # 利用反射 获取到模块中类的变量名
obj = cls()
obj.send(content)
#__init__
NOTIFY_LIST = [
'notify.email.Email',
# 'notify.msg.Msg',
'notify.wechat.WeChat',
'notify.qq.QQ',
]
#setting
import notify
notify.send_all('今天鸡哥争取提前下课~')
#run
class WeChat(object):
def __init__(self):
pass # 发微信需要的前提准备工作
def send(self, content):
print('微信通知:%s' % content)
#WeChat