Day 59 Django auth模塊/插拔式設計/csrf_token

[TOC]python

Django auth模塊

命令行建立超級用戶ajax

python manage.py createsuperuser

auth模塊經常使用方法

1. 建立用戶django

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='lsewj@126.com')

2. 校驗用戶登陸狀態session

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. 保存用戶登陸狀態app

auth.login(request, user_obj)
# 只要這句話執行了 後面在任意位置 只要你能拿到request你就能夠經過request.user獲取到當前登陸的用戶對象,加了sessionid

4. 判斷當前用戶是否登陸post

request.user.is_authenticated()

5. 校驗原密碼是否正確ui

request.user.check_password(old_password)

6. 修改密碼加密

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

7. 註銷url

auth.logout(request)

8. 校驗用戶是否登陸的裝飾器spa

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表字段

方式一

利用一對一外鍵字段關係

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

方式二

利用繼承關係

在django.contrib.auth.models中有一個User類,它繼承了AbstractUser類

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

在post請求時會觸發 CsrfViewMiddleware 中間件

form表單post請求

在form表單中加入{% csrf_token %}便可

ajax中post請求

方式一

​ 如今頁面上書寫{% csrf_token %}

​ 而後在發送ajax請求的時候,經過標籤查找獲取隨機字符串添加到data自定義對象

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

方式二

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

方式三 官網提供的文件

​ 直接新建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')

FBV和CBV中csrf裝飾器的區別

csrf_exempt

csrf_exempt這個裝飾器只能給dispatch裝才能生效

@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全部方式均可以

相關文章
相關標籤/搜索