59日目Djangoの認証モジュール/プラグデザイン/ csrf_token

Djangoの認証モジュール

スーパーユーザを作成するためのコマンドライン

python manage.py createsuperuser

共通モジュールの認証方法

ユーザーを作成します。1.

from django.contrib.auth.models import User

# User.objects.create(username=username,password=password)  # 不可用  密码不是加密的
# User.objects.create_user(username=username,password=password)  # 创建普通用户    密码自动加密
User.objects.create_superuser(username=username, password=password, email='[email protected]')

ユーザーのログイン状態を確認します。2.

from django.contrib import auth

# res = User.objects.filter(username=username,password=password)  # 密码无法校验
from django.contrib import auth
# 必须传用户名和密码两个参数缺一不能
user_obj = auth.authenticate(request,username=username,password=password)

3.保存したユーザのログイン状態

auth.login(request, user_obj)
# 只要这句话执行了 后面在任意位置 只要你能拿到request你就可以通过request.user获取到当前登录的用户对象,加了sessionid

現在のユーザーのログインかどうかを判断する4

request.user.is_authenticated()

元のパスワードが正しいことを確認5.

request.user.check_password(old_password)

6.パスワードの変更

request.user.set_password(new_password)
# 一定要保存
request.user.save()

7.キャンセル

auth.logout(request)

ユーザがデコレータにログインしているかどうかをチェック8

from django.contrib.auth.decorators import login_required
# 局部配置
@login_required(login_url='/login/')
def logout(request):
    auth.logout(request)
    return HttpResponse('注销成功')

# 全局配置
# 首先在settings.py文件中直接配置LOGIN_URL = '/login/'
@ login_required
def logout(request):
    auth.logout(request)
    return HttpResponse('注销成功')
# 如果全局配置了,局部也配置了,那么以局部为准

拡張AUTH_USERフィールド

外部キーフィールドの使用の間に1対1の関係

class UserDetail(models.Model):
    phone = models.CharField(max_length=32)
    user = models.OneToOneField(to='User')

第二の方法

継承の使用

クラスAbstractUserを継承django.contrib.auth.modelsでUserクラスがあり、

from django.contrib.auth.models import AbstractUser
class Userinfo(AbstractUser):
    phone = models.BigIntegerField()
    register_time = models.DateField(auto_now_add=True)

プラグイン構成ファイルベースの設計

# start.py
import os
import sys


BASE_DIR = os.path.dirname(__file__)
sys.path.append(BASE_DIR)

if __name__ == '__main__':
    os.environ.setdefault('xxx', 'conf.settings')
    from lib.conf import settings
    print(settings.NAME)
# __init__.py
import importlib
from lib.conf import global_settings
import os

class Settings(object):
    def __init__(self):
        for name in dir(global_settings):
            if name.isupper():
                setattr(self, name, getattr(global_settings, name))
        module_path = os.environ.get('xxx')
        md = importlib.import_module(module_path)
        for name in dir(md):
            if name.upper():
                setattr(self, name, getattr(md, name))

settings = Settings()

csrf_token

ポスト要求はCsrfViewMiddlewareミドルウェアをトリガするとき

ポストリクエストフォームを形成します

フォームの形で参加{% csrf_token %}します

ポストの要求のAJAXで

書面{%csrf_token%}ページ

Ajaxリクエストは、カスタムオブジェクトにタグ検索ランダムデータ列で取得する際に送信され、

data:{'username': username, 'csrfmiddlewaretoken': $('input[name="csrfmiddlewaretoken"]').val()}

第二の方法

data:{'username': username, 'csrfmiddlewaretoken': '{{ csrf_token }}'}

ファイルの公式ウェブサイトは、以下の3つの方法を提供します

新しいファイルが直接コピーされているjsのコードを導入することができます

関連デコレータCSRF

csrf_exempt

from django.views.decorators.csrf import csrf_exempt

# 不校验csrf
#@csrf_exempt
def index(require):
    return HttpResponse('index')

csrf_protect

from django.views.decorators.csrf import csrf_protect

# 只校验加装饰器的方法
#@csrf_protect
def index(require):
    return HttpResponse('index')

CSRFデコレータでFBVとCBVの違い

csrf_exempt

このデコレータは発送のみ装備するために効果を取ることができますcsrf_exempt

@method_decorator(csrf_exempt, name='dispatch')
class MyIndex(views.View):
    # @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)
    
    def get(self, request):
        pass
    
    def post(self, request):
        pass

csrf_protect

すべてのメソッドはcsrf_protectすることができ

おすすめ

転載: www.cnblogs.com/2222bai/p/12010954.html