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

Auth模块

Auth模块是什么

Auth模块是Django自带的用户认证模块:因为我们会实现一些用户的登录、认证、注销等一些功能都需要先去验证,实现起来比较的麻烦.所以Django它默认的使用auth_user表来存储用户的数据.

Auth模块常用方法

form django.contrib import auth  # 导入auth模块

1.authenticate()认证

user = authenticate(usernmae='username',password='password')

# 它提供了用户的认证功能,会帮助我们去验证用户名和密码.需要传入username,password两个关键字参数,
如果成功它会返回一个User对象,它会在User对象上设置一个属性来标识后端已经认证了该用户.

2.login(HttpRequest, user)登录功能

from django.contrib.auth import authenticate, login

user = authenticate(username='username',password='password')
if user:
    login(request,user)

#该函数会接受一个HttpRequest对象,以及一个经过认证的User对象.
#它是实现一个用户的登录功能,本质上会在后端为该用户生成相关的session数据.

3.logout(request)注销功能

from django.contrib.auth import logout

def logout(request):
    logout(request)

# 该模块接收一个HttpRequest对象,无返回值.
# 当调用该函数的时候,当前请求的session信息会全部清除,没有登录使用也不会报错.

4.is_authenticated()判断认证是否通过

def my_view(request):
    if request.user.is_authenticated  # 它是用来判断用户是否通过了认证.

#request.user.is_authenticated(), 后面加括号能拿到True和False.

5.login_requierd()装饰器工具

form django.contrib.auth.decorators import login_required

@login_required
def my_view(request): # auth给我们提供的一个装饰器工具,用来给视图添加登录校验

# 若你没有登录,它会跳转到django默认的登录URL'/accounts/login/'并传递当前访问url的绝对路径(登录成功之后,会重定向到该路径)

# 你也可以进行自定义登录的URL,需要在配置文件中配置
示例:
settings.py下:
LOGIN_URL = '/login/' # 这里配置你项目登录页面的路由.

6.create_user()创建用户

from django.contrib.auth.models import User
user = User.objects.create_user(usernmae='用户名',password='密码',email='邮箱')

# auth提供的创建新用户的方法.需要提供上面的必须的参数.

7.create_superuser()创建超级用户

from django.contrib.auth.models import User
user = User.objects.create_superuser (username='用户名',password='密码',email='邮箱')

# auth提供一个创建超级用户的方法,需要提供上所需的参数.

8.check_password(password)

ok = user.check_password('密码')

# auth提供的一个检查密码是否正确的方法,需要提供当前用户的密码.
# 密码正确返回True,否则返回False.

set_password(password)

user.set_password(password='')
user.save()

# auth提供的一个修改密码的方法,接收要设置的新密码作为参数.
# 注意: 设置完毕之后一定要调用用户对象的save方法.

User对象的属性

  • username, password
  • is_staff: 用户是否拥有网站的管理权限
  • is_active:是否允许用户登录,设置为False,可以在不删除用户的前提下禁止用户登录

扩展默认的auth_user表

  1. 内置的认证系统很好用,但是规定的字段是固定的,我想要去加字段.
  2. 我们可以通过继承内置的AbstractUser, 来定义一个自己的Model类.
  3. 这样我们不仅能够灵活的添加字段,又能使用Django的认证功能了.
示例:
from dajngo.conrtib.auth.models import AbstractUser
class UserInfo(AbstractUser):
    phone = .....
    age = ....
    # 这样你就可以去灵活的去添加字段了

注意:
  1.# 通过上面的方式扩展了auth_user表之后,一定要在settings.py中告诉Django,我们使用了新表来做用户的认证,不然他不知道啊.
  AUTH_USER_MODEL = "app01.UserInfo" # 这是固定语法.
  2.一旦我们指定了新的认证系统所使用的表,我们就需要在数据库中重新创建该表,而不能使用原来默认的auth_user表了.

根据Auth实现登录等功能

# 注册功能
def register(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')  # 创建一个普通的用户
        User.objects.create_user(username=username,password=password,email='[email protected]')

    return render(request, 'register.html')

# 登录功能
def loginn(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user_obj = auth.authenticate(username=username,password=password) # 认证用户.
        if user_obj:
            print(user_obj)
            print(user_obj.password)
            auth.login(request,user_obj) # 记录用户的登录状态

            old_path = request.GET.get('next')
            if old_path:
                return redirect(old_path)
            else:
                return redirect('/home/')
    return render(request,'loginn.html')

# 家目录
@login_required
def home(request):
    return HttpResponse('我是家目录')

# 判定用户是否通登录
def index(request):
    print(request.user)  # 使用这个语句就能拿到登录用户的用户对象
    print(request.user.is_authenticated) # 看用户是否通过认证,可以反回True和False
    return HttpResponse('index')

# 修改用户密码
@login_required
def set_password(request):
    if request.method == 'POST':
        password = request.POST.get('password')
        re_password = request.POST.get('re_password')
        ok = request.user.check_password(password)

        if ok:
            request.user.set_password(re_password)
            request.user.save()
            return redirect('/loginn/')

    return render(request, 'set_password.html', locals())

# 注销功能
@login_required
def logout1(request):
    logout(request)

参考中间件,实现功能的插拔式设计

# 实现一个在QQ,微信,email等来进行发消息.

1.新建一个notify文件夹,实现一个功能对应一个py文件.如qq一个py文件,微信一个py文件.这个文件夹相当于一个包,里面有不同功能的模块.
  class Msg(object):  # 不同的py文件建立多个.
    def __init__(self):
        pass
    def send(self,content):  # 鸭子类型,都有发送的功能.
        print(f'短信通知{content}')  

2.创建一个settings文件夹.
  NOTIFY_LIST = [
     'notify.email.Msg',   # 写入对应的不同功能的路径
         ...
  ]

3.在notify文件夹下init下写入.
import settings
import importlib

def send_all(content):
    for module_path in settings.NOTIFY_LIST:  # 拿到notify.email.Msg,
        module, class_name = module_path.rsplit('.',maxsplit=1) # 从右按点切割一次.
           # 拿到module = notify.email  , class_name = Msg

        mod = importlib.import_module(module) # 等价于 from notify import msg

        cls = getattr(mod, class_name) # mod相当于一个个的文件夹的名字. class_name是类的名字.在这里面是字符串,意思就去msg文件夹下去寻找一个叫Msg的成员,然后复制给cls,然后通过cls实现对msg文件下类的调用.
        obj = cls()
        obj.send(content)

4.在run.py文件下.调用.
import notify  # 导入notify,调用notify.send_all.就能实现以个一起的来发消息.

notify.send_all('你们好啊') # 这是他实现的一个过程

# 这样做的好处
# 1.如果添加一个功能,直接新建一py问价,然后在settings配置一下就可以调用了.
# 2.若果想不用一个人功能直接在settings里注释掉就可以可.
# 3.且各个功能模块之间不受影响.每一个都是单独的.

BBS表设计

注意事项

1.在评论表里针对对用户id来说, user_id字段可以有多个用户,但是一个用户只有一个id.所以是一对多.

2.在评论表里针对文章id来说,article_id字段可以有多篇文章,但是一篇文章只有一个id,所以是一对多

3.在点赞表里针对用户id来说,user_id字段可以有多个用户,但是一个用户只能对应一个.

4.在点赞表里针对文章id来说,article_id字段可以有多篇文章,但是一篇文章只对应一个id.

原文地址:https://www.cnblogs.com/kangwy/p/11774251.html

时间: 2024-10-10 10:00:00

Auth模块、插拔式设计、BBS表设计的相关文章

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 == '

班级通讯录系统初步设计--表设计

知识概要: 数据表设计初步 重构登陆界面和主界面设计初步 教学设计: 一.  通讯录系统开发维护Ver0.1 1.开始维护现有程序,理解程序,用例图Ver1.0. 2.找bug,改bug,重构小部分代码,以满足用户的需求.在现有版本的基础上做增量开发 1)         理解需求 2)         设计 3)         开发 4)         测试 二.  "班级通讯录管理系统"数据库和数据表样本设计初步 1.数据库初步应用 2.纸质的班级通讯录----"联系

Django中间件,csrf校验和装饰器以及auth模块和部分功能

一.Django中间件 1).什么是中间件 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定的功能. 但是由于其影响的是全局,所以需要谨慎使用,使用不当会影响性能. 说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法. 我们一直都在使用中间

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.

数据库权限表设计

最近项目的项目很奇怪,一个大项目(系统)里包含了很多小的子系统,而这些子系统中都有权限控制的部分,这件事情挺让我头痛的,记得一年前在沈阳,我曾经有一段时间也因因这个问题而疲于奔命,为什么说疲于奔命呢?由于当时项目进度不允许,导致最终系统权限模块草草了事,每个模块都是由读权限字符串来控制用户ACL,当用户无法访问时,提示权限不够.这么做对用户是很不负责任的,既然让用户看到了操作的方式和界面,为什么又告诉用户没有权限呢?我开始怀疑我们是否应该在底层就封杀用户的访问权限. 现在项目开展起来了,虽然目前

数据库表设计的随笔(分库分表)

笔者目前就职的是一家创业型的互联网公司,既然算是互联网公司,那么就会设计到无论是应用系统还是数据库的分布式.下面简单介绍下有关数据库方面的一些设计. 数据库表的设计,根据自己的业务所需可以拆分成多库.有订单库.产品库.账户库.底层支付库等等,这也就是传说中的垂直分库.那么数据库架构和数据库优化有哪些解决思路: 1.垂直分表.垂直分表也就是“一张表拆分成多张表”,比如订单表里面,有不同类型的订单,拿普通订单和一元夺宝订单来说,一元夺宝订单会有抽奖码中奖吗等等,这些是一元夺宝订单独有的,就可以单独拿

优化Oracle数据库表设计

绝大多数的Oracle数据库性能问题都是由于数据库设计不合理造成的,只有少部分问题根植于Database Buffer.Share Pool.Redo Log Buffer等内存模块配置不合理,I/O争用,CPU争用等DBA职责范围上.所以除非是面对一个业已完成不可变更的系统,否则我们不应过多地将关注点投向内存.I/O.CPU等性能调整项目上,而应关注数据库表本身的设计是否合理,库表设计的合理性才是程序性能的真正执牛耳者.合理的数据库设计需要考虑以下的方面: ·业务数据以何种方式表达.如一个员工

系统管理模块_部门管理_设计(映射)本模块中的所有实体并总结设计实体的技巧_懒加载异常问题_树状结构

系统管理模块_部门管理_设计本模块中的所有实体并总结设计实体的技巧 设计实体流程 1,有几个实体? 一般是一组增删改查对应一个实体. 2,实体之间有什么关系? 一般是页面引用了其他的实体时,就表示与这个实体有关联关系. 3,每个实体中都有什么属性? 1,主键.推荐使用代理主键 2,关联关系属性.在类图中,关联关系是一条线,有两端,每一端对应一个表达此关联关系的属性.有几个端指向本类,本类中就有几个关联关系属性. 3,一般属性.分析所有有关的页面,找出表单中要填写的或是在显示页面中要显示的信息等.

MySQL的多表设计

一.外键约束 保证数据的完整性. 定义外键约束: 可以直接在create语句中定义外键 foreign key 当前表名(字段名) references 目标表名(目标表的主键) 创建完语句后,可以直接使用修改语句定义 alter table 表名 add foreign key 当前表名 (字段名) references 目标表名(目标表的主键) 二.多表设计的三种实体关系 多对多.一对多和一对一 三.多表设计之---------一对多 一个班级可以有多个学生,但是一个学生只能属于一个班级.或