auth模块 + 插拔式思想

auth模块 + 插拔式思想

一、auth模块

? django为方便实现用户功能,包括登陆注册注销修改信息等,提供了auth模块,实现操作简单化。

1.1 常用方法

? 超级用户:

# run manage.py Task:
createsuperuser

? authenticate():用户认证,认证成功会返回User对象,不成功返回None

from django.contrib import auth

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')

        # 验证用户是否存在
        user_obj = auth.authenticate(username=username, password=password)

? login(HttpRequest,user):接受一个HttpRequest对象,以及一个验证后的对象,会在后端为这个用户生成相关的session数据;

# 保存登录信息
auth.login(request,user_obj)   #执行后,可以通过request.User获取到登录用户对象

? is_authenticated(): 判断当前用户是否登录;

request.user.is_authenticated()

? 获取当前用户:

user_obj = request.user

? loginout(request): 接受一个HttpRequest,清楚当前请求的session信息。如果用户未登录,也不会报错;

from django.contrib.auth import logout

def llogout(request):
    logout(request)

? login_required():登录认证装饰器;

from django.contrib.auth.decorators importlogin_requird

# 局部配置
@login_required(login_url = '/xxx/')

# 全局配置
@login_required
def home(request):
    return HttpResponse('home页面')

'''
当用户没有登录的情况下 跳转的url有两种配置方式:
    1.在装饰器括号内通过login_url参数局部指定
    2.全局配置  用户没有登录的情况下 所有的视图统一跳转到一个url
'''

? create_user():创建用户;

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=passwore, email='[email protected]')

? check_password(password):检查密码,正确返回Ture,错误为False;

? set_password(password):设置新密码;

@login_required
def set_password(request):
    if request.method == 'POST':
        old_password = request.POST.get('old_password')
        new_password = request.POST.get('new_password')
        # 校验原密码
        is_right() = request.user.check_password(old_password)
        if is_right:
            # 设置新密码
            request.user.set_password(new_password) # 此时值保存在内存中
            request.user.save()  # save()后才保存在数据库中
            return redirect('/login/')
    return render(request, 'set_password.html', locals())

1.2 扩展默认表

? auth模块有内置表格和字段,但是只是框架,使用时还需要其他字段信息。可以键一张一对一的auth_user表的关联表,只要继承AbstractUser即可。

from django.contrib.auth.models import AbstractUser

class UserInfo(AbstractUser)  # 注意,自定义表中字段不能与auth_user表中的字段冲突
    phone = models.BigIntegerField()
    register_time = models.DataField(auto_now_add=Ture)

def __str__(self):
    return self.username

? 注意:采用上述方式扩展auth_user表后必须在settings.py中配置:

AUTH_USER_MODEL = "app名.Userinfo"

? 再注意:一旦制定了新的表,就需要在数据库中重建表,不能继续使用默认的auth_user表了。

二、参考django 中间件配置,实现功能的插拔式设计

? django的中间件可以按要求筛选信息,当不需要这个要求时,可以在settings.py中将这条筛选要求注销掉,便可以实现。这就提供了一种封装功能的方法,例如广播系统,采用短信、邮件、QQ等多种方法发布信息,可以通过在settings中实现注销方法或者是增加增加新的方法。

? 思路:将各种发送信息的功能封装在不同的py文件中,都定义成鸭子类型。在配置文件中将写下功能的路径,在init文件中,对路径进行处理,使用getattr的方法,设置方法。这样新增新的方法,就可以写好方法的py文件再在配置文件中加入路径,取消方法就在配置文件中注销掉方法对应的路径即可。

? notify文件夹下:

? __init__:

import settings
import importlib

def send_all(content):
    for module_path in settings.NOTIFY_LIST:
        module, class_name = module_path.rsplit('.', maxslipt=1)
        # module = 'notify.email'  class_name = 'Email'
        mod = importlib.import_module(module)  # mod时模块名,例如email.py
        cls = getattr(mod, class_name)
        obj = cls()
        obj.send(content)

? email.py:

class Email(object):
    def __init__(self):
        pass   # 省略相关配置操作

    def send(self, content):
        print('邮件通知:%s' % content)

? msg.py:

class Msg(object):
    def __init__(self):
        pass  # 省略相关配置操作

    def send(self,content):
        print('短信通知:%s'%content)

? wechat:

class WeChat(object):
    def __init__(self):
        pass  # 省略相关配置操作

    def send(self, content):
        print('微信通知:%s' % content)

? qq.py:

class QQ(object):
    def __init__(self):
        pass   # 省略相关配置操作

    def send(self,content):
        print('qq通知:%s'%content)

? run.py

import notify

notify.send_all('测试信息')

? settings.py

NOTIFY_LIST = [
    'notify.email.Email',
    # 'notify.msg.Msg',   # 注销掉msg,可以关闭短信发送消息的功能
    'notify.wechat.WeChat',
    'notify.qq.QQ',
]

原文地址:https://www.cnblogs.com/tangceng/p/11774370.html

时间: 2024-10-12 23:44:39

auth模块 + 插拔式思想的相关文章

django 之csrf、auth模块及settings源码、插拔式设计

目录 基于django中间件拷贝思想 跨站请求伪造简介 跨站请求伪造解决思路 方式1:form表单发post请求解决方法 方式2:ajax发post请求解决方法 csrf相关的两个装饰器 csrf装饰器在CBV上的特例 django settings源码 auth模块简介 auth创建用户 auth扩展表 基于django settings配置文件实现插拔式设计 csrf:Cross Site Request Forgery protection 基于django中间件拷贝思想 # start.

Auth模块、插拔式设计、BBS表设计

Auth模块 Auth模块是什么 Auth模块是Django自带的用户认证模块:因为我们会实现一些用户的登录.认证.注销等一些功能都需要先去验证,实现起来比较的麻烦.所以Django它默认的使用auth_user表来存储用户的数据. Auth模块常用方法 form django.contrib import auth # 导入auth模块 1.authenticate()认证 user = authenticate(usernmae='username',password='password')

Django对中间件的调用思想、csrf中间件详细介绍、Django settings源码剖析、Django的Auth模块

目录 使用Django对中间件的调用思想完成自己的功能 功能要求 importlib模块介绍 功能的实现 csrf中间件详细介绍 跨站请求伪造 Django csrf中间件 form表单 ajax csrf相关装饰器 在CBV上加csrf装饰器 Django settings源码剖析及模仿使用 Django settings源码剖析 查看内部配置文件 模仿使用 Auth模块 auth简介 auth模块常用方法 创建用户 校验用户名和密码 保存用户登录状态 判断当前用户是否登录 校验原密码 修改密

☆Django☆---中间件 csrf跨站请求伪造 auth模块 settings功能插拔式源码

Django中间件 django生命周期图 中间件: 概念: Django中间件就类似于 django的保安   请求 的时候需要先经过中间件才能到达django后端(urls, views)   响应 走的时候也需要经过中间件才能到达web服务网关接口 django默认的七个中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.Session

1205 CSRF跨站请求与django中的auth模块使用

目录 今日内容 昨日回顾 基于配置文件的编程思想 importlib模块 简单代码实现 跨站请求伪造csrf 1. 钓鱼网站 如何实现 模拟该现象的产生 2. 解决问题 解决 {% csrf_token %} 3. ajax如何解决 方式1 方式2 方式3 4. csrf相关的两个装饰器 1. 使用 2. 两个装饰器在CBV上的异同 django里settings源码剖析 django有两个配置文件 django auth模块 1. 是什么 2. 常用方法 2.1 创建用户 create_use

CSRF与auth模块

目录 一.模拟实现中间件的编程思想 (一)impotlib模块 (二)实现功能的配置使用 二.跨站请求伪造CSRF (一)由来 (二)form表单的CSRF (三)ajax中的CSRF (1)通过data携带 (2)通过headers携带 (3)官网提供的文件(推荐用法) (四)CSRF相关的装饰器 (1)MTV模型中使用 (2)CBV模型中使用 三.Django中auth模块 (一)什么是auth模块 (二)常用方法 (1)创建用户 (2)校验用户 (3)登录保存 (4)是否登录 (5)检验密

Java-单机版的书店管理系统(练习设计模块和思想_系列 四(2) )

说明: 本博客为补全上篇-Java-单机版的书店管理系统(练习设计模块和思想_系列 四(1) )的,所以如果不懂,请先看上一篇. 本系列都是我一步一步学习来的, 所以,可能比较适合初学设计模块的人来学. 现在补全我目前写的所以代码: 公共类: 用户类型枚举:UserTypeEnum类 package cn.hncu.bookStore.common; /** * 功能:用户类型的枚举!<br/> * 定义在公共模块.<br/> * 变量:<br/> * ADMIN(1,

用户认证--------------auth模块

一.auth模块 from django.contrib import auth 1 .authenticate()   :验证用户输入的用户名和密码是否相同 提供了用户认证,即验证用户名以及密码是否正确,一般需要username  password两个关键字参数 如果认证信息有效,会返回一个  User  对象.authenticate()会在User 对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的.当我们试图登陆一个从数据库中直接取出来不经过authent

用户认证auth模块

auth模块引入 from django.contrib import auth authenticate()    提供了用户认证,即验证用户名以及密码是否正确,一般需要username  password两个关键字参数 如果认证信息有效,会返回一个  User  对象,如果用户不存在返回一个空authenticate()会在User 对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的.当我们试图登陆一个从数据库中直接取出来不经过authenticate()的U