ジャンゴ-8

ジャンゴ-8

認証認証モジュール

当社は、ユーザーのシステムを実現するためにウェブサイトを設計する必然的な必要性を、サイトを開発しています。この時点では、パスワードやその他の機能を変更、ログオフ、ユーザー登録、ユーザーのログイン、ユーザ認証を含め、達成する必要があります。

Djangoは完全にユーザーデータを格納するテーブルをAUTH_USERするための強力なユーザ認証システム--auth、デフォルトを建て、このシリーズの機能をカプセル化します。

from django.contrib import auth

スーパーユーザを作成します

スーパーユーザを作成し、管理インタフェースのためのDjangoのadminにログインします。

createsuperuser

ユーザーが存在するかどうかを確認してください

user_obj = auth.authenticate(username=username,password=password)

認証()つまり、ユーザー名とパスワードが正しいことを確認するために、ユーザ認証機能を提供し、それは通常2つのキーワード引数のユーザ名とパスワードを取ります。認証が成功した場合、それはユーザーオブジェクトを返します。認証は、NULLが返され、失敗します。

()認証後端ユーザがユーザを認証した識別するために、オブジェクトのプロパティを設定し、その後のログオンプロセスにおいてこの情報が必要とされます。

ユーザーのログイン状態を保存

auth.login(request,user_obj)

この文の実装が完了した後、限りの場所が要求を得ることができるよう、あなたはからrequest.userを流れる電流ログオンしているユーザーのオブジェクトを取得することができます。

現在のユーザーのログインかどうかを確認

request.user.is_authenticate()

ブラケットが増加した時間から追加することができ、その結果はブール値です。

ログアウトセッション

logout(request):関数が呼び出されると、現在の要求は、すべてのセッション情報をクリアします。ユーザーがログインしていない場合であっても、また文句はありません。この機能を使用しています。

認証モジュールのログイン認証デコレータ

二つの方法で:

from django.contrib.auth.decorators import login_required
@login_required  # 全局配置
def home(request):
    return HttpResponse('home页面')

@login_required(login_url='/xxx/')  # 局部配置
def index(request):
    return HttpResponse('index页面')
'''
1. 在装饰器括号内通过login_url参数局部指定。
2.全局配置,在用户没有登录的情况下,所有的视图同意跳转到一个url
    须手动配置:
        LOGIN_URL = '/login/'
'''

パスワードの変更

元のパスワードが正しいことを確認します。

request.user.check_password(old_password):、古いパスワードが正しい戻り値ブール値をチェック

新しいパスワードを設定します。

request.user.set_password(new_password)

request.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)

一个修改密码的简单示例

ユーザー登録

User.objects.create(username=username,password=password)

パスワードがプレーンテキストとして保存されますが、パスワードのAUTH_USERリストが暗号化されているので、この方法は利用できません作成するために作成するために作成して使用してください。

User.objects.create_user(username=username,password=password)

通常のユーザーを作成し、あなたが必要なパラメータ(ユーザ名、パスワード)を提供する必要があります。

User.objects.create_superuser(username=username,password=password,email='[email protected]')

スーパーユーザは、フィールドが満たされなければならないメールボックスを作成します。

プロパティユーザーオブジェクト

ユーザーオブジェクトのプロパティ:ユーザー名、パスワード

is_staff:ユーザーがサイトの管理者権限を持っているかどうか。

is_active:Falseに設定されたユーザのログインを許可するかどうかは、ユーザーの構内を削除せずにログインからユーザーを停止することができます。

拡張フィールドAUTH_USERテーブル

まず AbstractUserを継承models.pyカスタムクラスで

from django.contrib.auth.models import AbstractUser

class Userinfo(AbstractUser): ...

注意:継承されたAbstractUserカスタムを見た後、フィールドには、元の競合を整理問題ではありません。

第二に、代替AUTH_USERテーブルとして新しいクラスを使用するようにジャンゴを伝えるために、設定ファイルの設定を指定してください

AUTH_USER_MODEL = 'app01.Userinfo'
固定構文:AUTH_USER_MODEL =「アプリケーション名テーブル」

あなたはモジュールの認証のすべての機能を引き続き使用することができ、上記の新しいテーブルをUSER_INFO。

プラグイン可能なデザインは、機能を実現します

リファレンスDjangoのミドルウェアの設定:したくない機能、設定ファイルには、もはや役割を果たしていないだろうコメントしています。

# 自定义类,可以有很多,每个类都有send方法(鸭子类型)
class Msg():
    def send(self,content):
        print(f'短信通知:{content}')
# 将自定义类放在notify包里,(包里有__init__.py)
# 配置文件中存放自定义类的字符串路径
NOTIFY_LIST = [
    'notify.msg.Msg',
    'notify.wechat.Wechat',
    'notify.qq.QQ',
]
# run启动文件,调用notify包里(__init__)的方法
import notify
notify.send_all('XXXXXX')

######################核心/精髓###########################
# __init__.py
import settings
import importlib
def send_all(content):
    for module_path in settings.NOTIFY_LIST:
        # notify.msg.Msg'
        module,class_name = module_path.rsplit('.',maxsplit=1)
        mod = importlib.import_module(module)
        cls = getattr(mod,class_name)
        obj = cls()
        obj.send(content)
'''
循环拿到每个字符串路径
字符串切割拿到导包前缀和类名
通过importlib模块对导包前缀进行导包
通过字符串类名反射拿到类
类加括号拿到类对象
对象.send()执行当前循环下的类的send方法
'''

おすすめ

転載: www.cnblogs.com/dadazunzhe/p/11774018.html