计算机基础知识66

Auth的补充

#概念:是django 的一个app,关于用户的登录,退出,注册...
# 配置文件中配置:表会被迁移

INSTALLED_APPS = ['django.contrib.auth',]

# auth有哪些表---权限控制:

Permission:auth_permission
Group:auth_group
User:auth_user  --->密码加密auth_group_permissions
auth_user_groups
auth_user_user_permissions

# 目前阶段只用 auth_user来做用户的一些操作

# 如果用户没登录:

request.user取出的是匿名用户:

        AnonymousUser类的对象,也有pk,name,is_authenticated
# 模块常用方法:
1 user = authenticate(username='usernamer',password='password')

# 校验用户:必须传username和password
user = authenticate(username='usernamer',password='password')
from django.contrib.auth.models import User
user=User.objects.filter(username=username).first()
if user and user.check_password(password):print('用户名密码正确')
else:print('用户名密码错误')

2 login:用户校验通过,让它登录,执行它
        -当前登录用户写入到session中
        -后续 request.user 就能拿到当前登录用户

auth.login(request, user)
user=request.user

3 logout:退出,清空session
4 request.user.is_authenticated:返回True或False
5 login_requierd :登录认证装饰器,放在视图函数上 ,会重定向
                @login_required(login_url='/login/')
6 create_user:普通用户
        -User.objects.create()--密码是加密的---》这样存密码是明文的
7 create_superuser:超级用户  python38 manage.py createsuperuser

8 check_password :通过明文密码校验密码是否正确
9 set_password:修改密码

user.set_password(new_password)
user.save()

10 User对象的属性:
username 
password
is_staff : 用户是否拥有网站的管理权限,能不能登录admin后台管理
is_active: 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录
                       is_active是False----authenticate也查不出来
is_superuser:是否是超级管理员,admin中权限最高

# auth模块的密码加密:同样的密码--》再次加密--》密文也不一样
    pbkdf2_sha256$   # 加密方式 
    260000$               #过期时间
    H93ubuUFw6FbYc6B8ojzKA$              # 随机串,,秘钥
    H0ZnaiJOm/pI4K802Y2TcO5SQ7iWDcx5E+mb/hdABd8=       #明文加密后的
# 后期如果你自己写了User表,但是想用人家的密码加密,就可以使用 

res=make_password('123456')
check_password(明文,密文)

扩写auth的user表

# 第一种方案:通过一对一扩展(基本不用)

from django.contrib.auth.models import User
class UserDetail(models.Model):user=models.OneToOneField(to=User)phone=models.CharField(max_length=32)

# 第二种:通过继承 AbstractUser表来扩写
1、在models.py中写用户表

from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):# 原来有的字段就不需要写了,只需要扩写你想写的字段mobile=models.CharField(max_length=32)icon=models.ImageField(upload_to='/icon/',default='default.png') # 路径和默认值

2、在settings.py 配置

AUTH_USER_MODEL='app名字.表名'  # 不区分大小写
AUTH_USER_MODEL='app01.UserInfo'

3、之前不要迁移数据,一旦迁移过,就不行了
      一旦迁移过了,按这个步骤操作:
            -1 删库
            -2 删迁移文件(所有你写的app都删)
            -3 删除源码中 auth和admin的迁移文件---》写在djagno重装

缓存

# 概念:缓存又称页面静态化, django 默认就支持缓存
# 原由:本身数据在数据库中,如果访问量较大,每次都需要去数据库查询,影响效率。

        可以对数据做缓存,以后先从缓存中取数据

        如果取到:直接返回,不需要查数据库

        如果取不到:再查数据库,查完放到缓存中

# 缓存到的位置:           

            内存缓存(演示)
            文件缓存 
            数据库缓存
            redis缓存(后期会用)    
# 默认情况,缓存到内存中

CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',}
}

# 缓存到文件中

CACHES = {'default': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎'LOCATION': 'D:\pythonproject\huancun_file',        #指定缓存的路径'OPTIONS':{'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)'CULL_FREQUENCY': 3,           # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)}}   }

# 缓存的具体使用:三种粒度
    1 全站缓存:只需要置两个中间件即可        
    2 视图缓存
    3 局部缓存:在页面某个位置缓存    
全站缓存,使用方式-如下-只需要配置中间件即可

MIDDLEWARE = ['django.middleware.cache.UpdateCacheMiddleware',...'django.middleware.cache.FetchFromCacheMiddleware'
]

# 视图缓存

from django.views.decorators.cache import cache_page
@cache_page(timeout=10)
def demo09(request):print('来了老弟')book_list = Book.objects.all()return render(request, 'books.html', {'books': book_list})

# 局部缓存

{% load cache %}
{% cache 10 'name' %}
可以能有很多代码
{% endcache %}

项目开发流程

项目立项——公司高层定的
需求调研和分析-——市场人员,技术人员
                                       需求文档 说明   
开发部门开会——确定项目架构,技术选型,数据库设计
ui,ud团队(产品经理)——原型图---切图--交给前端
分任务开发:
            -前端
            -后端:对着原型图--》设计--》设计数据库,设计功能    
前后端联调
提交版本——测试
发布上线

BBS项目功能

1、注册功能:校验
                  ajax注册
                  头像显示和上传
2、登录
3、首页文章显示(分页---》自己加上)
4、个人站点:显示这个人写的所有文章
                  侧边栏有分类,标签,随笔档案
5、文章详情
6、点赞,点踩
7、评论:根评论
           子评论
8、后台管理:查看所有文章
                  删除文章
                  新增文章:xss攻击去除

设计数据库

1 用户表 UserInfo--->扩写auth的user表
2 博客表 Blog--->跟用户表做一对一关联
3 文章表 Article
4 文章分类表  Category
5 标签表  Tag
6 点赞点踩表  UpAndDown
7 评论表  Commit

# 关联关系:
        用户和博客 :  一对一
        博客和文章: 一对多  一个博客下,有很多文章,关联字段写在文章表中
        博客和分类: 一对多  一个博客下,创建多个分类,关联字段写在分类表中
        博客和标签:    一对多  一个博客下,创建多个标签,关联字段写在标签表中

        文章和分类: 一对多   一个文章只能属于一个分类,一个分类下有很多文章
        文章和标签:多对多    一个文章可以有多个标签,一个标签下可以有多个文章

        点赞和用户:一对多  一个用户可以点很多赞,一个用户可以点很多赞
        评论和用户:一对多  一个用户可以评论多个,评论的一条记录只属于一个用户

        文章和点赞:一对多 一篇文章,可以被点多次,但是一个点赞的记录只对应一篇文章
        文章和评论:一对多 一篇文章,可以被评论多次,但一个评论的记录只对应一篇文章

setting文件配置

# 解释器环境中有 djagno ==3.2.20
# 1 国际化:

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False

# 2 配置了static

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

# 3 配置了media

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

# 4 配置了链接mysql

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'blog','USER': 'root','PASSWORD': '1234','HOST': '127.0.0.1','PORT': 3306}
}

创建项目迁移表

1 用户表 UserInfo---》扩写auth的user表
2 博客表 Blog---》跟用户表做一对一关联
3 文章表 Article
4 文章分类表  Category
5 标签表  Tag
6 点赞点踩表  UpAndDown
7 评论表  Commit

models.py
from django.db import models
from django.contrib.auth.models import AbstractUserclass UserInfo(AbstractUser):# 扩写字段---》手机号,头像,phone = models.CharField(max_length=32)# /media/avatar/default.png# 必须安装pillow 才能使用 ImageFieldavatar = models.ImageField(upload_to='avatar', default='avatar/default.png')blog = models.OneToOneField(to='Blog', on_delete=models.CASCADE, null=True)class Meta:verbose_name_plural = '用户表'  # 给其他人看,知道这是用户表def __str__(self):return self.usernameclass Blog(models.Model):# 博客标题site_title = models.CharField(max_length=32)# 博客副标题site_name = models.CharField(max_length=32)# 博客样式# 每个人样式不同(文件地址)site_style = models.CharField(max_length=32)class Meta:verbose_name_plural = '博客表'def __str__(self):# 会报错try:return self.userinfo.username + '---' + self.site_titleexcept Exception as e:return self.site_titleclass Tag(models.Model):name = models.CharField(max_length=32)blog = models.ForeignKey(to=Blog, on_delete=models.SET_NULL, null=True)class Meta:verbose_name_plural = '标签表'def __str__(self):return self.nameclass Category(models.Model):name = models.CharField(max_length=32)blog = models.ForeignKey(to=Blog, on_delete=models.SET_NULL, null=True)class Meta:verbose_name_plural = '分类表'def __str__(self):return self.nameclass Article(models.Model):title = models.CharField(max_length=128)# 文章摘要desc = models.CharField(max_length=256, verbose_name='文章摘要')# 文章详情  大文本content = models.TextField()create_time = models.DateTimeField(auto_now_add=True)# 关联字段# 标签和分类category = models.ForeignKey(to=Category, on_delete=models.SET_NULL, null=True)# 多对多,手动创建中间表tag = models.ManyToManyField(to=Tag, through='ArticleToTag', through_fields=('article', 'tag'))# 博客blog = models.ForeignKey(to=Blog, on_delete=models.CASCADE)class Meta:verbose_name_plural = '文章表'def __str__(self):return self.titleclass ArticleToTag(models.Model):article = models.ForeignKey(to=Article, on_delete=models.CASCADE)tag = models.ForeignKey(to=Tag, on_delete=models.CASCADE)class UpAndDown(models.Model):user = models.ForeignKey(to=UserInfo, on_delete=models.CASCADE)article = models.ForeignKey(to=Article, on_delete=models.CASCADE)is_up = models.BooleanField(default=True)create_time = models.DateTimeField(auto_now_add=True)class Meta:verbose_name_plural = '点赞点踩'def __str__(self):return self.is_upclass Commit(models.Model):user = models.ForeignKey(to=UserInfo, on_delete=models.CASCADE)article = models.ForeignKey(to=Article, on_delete=models.CASCADE)content = models.CharField(max_length=256)create_time = models.DateTimeField(auto_now_add=True)# 自关联,评论层级---》子评论   一定要写null=Trueparent_id = models.ForeignKey(to='self', on_delete=models.CASCADE, null=True)class Meta:verbose_name_plural = '评论表'def __str__(self):return self.content

# 自关联:

注册功能案例

完成注册功能---高级一些使用form
    -头像实时显示
    -注册失败错误信息展示
    -注册成功跳转到登录页面

测试三种缓存粒度

全站缓存:

1、缓存在文件中:

setting.py
MIDDLEWARE = [      # 全栈,两个中间键'django.middleware.cache.UpdateCacheMiddleware','django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',# 'django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware','app01.middle_key.MyMiddlew','django.middleware.cache.FetchFromCacheMiddleware'
]CACHES = {     # 存在文件中'default': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎'LOCATION': 'D:\pythonproject\huancun_file',        #指定缓存的路径'OPTIONS':{'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)'CULL_FREQUENCY': 3,           # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)}}
}
views.py
# 全站缓存
from .models import  Data
def demo09(request):print('你好,周佳佳')data=Data.objects.all()return render(request,'shuju.html',{'data':data})
shuju.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css" rel="stylesheet"><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="row"><div class="col-md-6 col-md-offset-3"><div class="bd-example"><table class="table table-striped"><thead><tr><th>id</th><th>书名</th><th>价格</th><th>出版社</th></tr></thead><tbody>{% for book in data %}<tr><th scope="row">{{ book.id }}</th><td>{{ book.username }}</td><td>{{ book.email }}</td><td>{{ book.password }}</td></tr>{% endfor %}</tbody></table></div></div>
</div>
</body>
</html>

2、缓存在内存中,看不见

CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',}
}

视图缓存:

views.py
from .models import  Data
from django.views.decorators.cache import cache_page
@cache_page(timeout=10)
def demo09(request):print('你好,周佳佳')data=Data.objects.all()return render(request,'shuju.html',{'data':data})

局部缓存:

html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css" rel="stylesheet"><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.bundle.min.js"></script>
</head>
{% load cache %}
<body>
<div class="row"><div class="col-md-6 col-md-offset-3"><div class="bd-example"><table class="table table-striped"><thead><tr><th>id</th><th>书名</th><th>价格</th><th>出版社</th></tr></thead><tbody>{% for book in data %}<tr><th scope="row">{{ book.id }}</th><td>{{ book.username }}</td><td>{{ book.email }}</td><td>{{ book.password }}</td></tr>{% endfor %}</tbody></table>{% cache 1 'name' %}<hr>{{ time }}{% endcache %}</div></div>
</div>
</body>
</html>
views.py
# 视图缓存
from .models import  Data
import datetime
def demo09(request):print('你好,周佳佳')data=Data.objects.all()return render(request,'shuju.html',{'data':data,'time':str(datetime.datetime.now())})

bootstrap5 的使用

使用bootstrap5 美化注册页面

下载 -Bootstrap中文网

# CSS引入<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css" rel="stylesheet"><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.bundle.min.js"></script>

今日思维导图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/211960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用23种设计模式打造一个cocos creator的游戏框架----(十二)状态模式

1、模式标准 模式名称&#xff1a;状态模式 模式分类&#xff1a;行为型 模式意图&#xff1a;允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 结构图&#xff1a; 适用于&#xff1a; 1、一个对象的行为决定于它的状态&#xff0c;并且它必须…

【C语言】字符串函数strcpystrcatstrcmpstrstr的使⽤和模拟实现

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 ✏️真正相信奇迹的家伙&#xff0c;本身和奇迹一样了不起啊&#xff01; 欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;>希望看完我的文章对你有小小的帮助&am…

电源小白入门学习1——电源系统架构和相关指标

电源小白入门学习1——电源系统架构和相关指标 电源系统架构电源系统的指标及测量方法电源的效率电源的静态电流输出电压调整率纹波测量的注意事项动态负载测试 在开始本期内容之气&#xff0c;我先简单介绍一下我们电源小白学习系列内容&#xff1a;首先我是一个嵌入式小白&am…

在VSCode中运行Python脚本文件时如何传参

以下实验所处的操作系统环境说明&#xff1a; OS版本MacOSMonterey 12.1VSCodeOctober 2023 (version 1.84.2) 一、背景 在 VSCode 中写好 Python 脚本后&#xff0c;如果要运行起来&#xff0c;可以怎么做呢&#xff1f; 一般有以下几种方式&#xff1a; 1、直接在 VSCode…

sentinel整合nacos配置中心持久化

在网上找了很多的资料&#xff0c;发现sentinel整合nacos持久化的博文和视频大多数都只有改造限流部分的教程&#xff0c;并且都需要修改前端&#xff0c;略显麻烦&#xff0c;至于剩下的熔断、热点流控、授权的更是没有相关的改造教程&#xff0c;最后在知乎的看到一篇文章后让…

百科词条可以删除吗?如何删除自己的百度百科?

近日&#xff0c;小马识途营销顾问接到不少客户删除自己百科词条的咨询&#xff0c;有不少人自己并没有去建立百科词条&#xff0c;但是网上已经有了&#xff0c;有的信息不正确&#xff0c;甚至有的信息是负能量的&#xff0c;对当事人自己造成一定的困扰&#xff0c;所以寻求…

PbootCMS 前台RCE漏洞复现

0x01 产品简介 PbootCMS是全新内核且永久开源免费的PHP企业网站开发建设管理系统,是一套高效、简洁、 强悍的可免费商用的PHP CMS源码,能够满足各类企业网站开发建设的需要 0x02 漏洞概述 PbootCMS v<=3.1.6版本中存在模板注入,攻击者可构造特定的链接利用该漏洞,执行…

线程及实现方式

一、线程 线程是一个基本的CPU执行单元&#xff0c;也是程序执行流的最小单位。引入线程之后&#xff0c;不仅是进程之间可以并发&#xff0c;进程内的各线程之间也可以并发&#xff0c;从而进一步提升了系统的并发度&#xff0c;使得一个进程内也可以并发处理各种任务&#x…

【Hive】——安装部署

1 MetaData&#xff08;元数据&#xff09; 2 MetaStore &#xff08;元数据服务&#xff09; 3 MetaStore配置方式 3.1 内嵌模式 3.2 本地模式 3.3 远程模式 4 安装前准备 <!-- 整合hive --><property><name>hadoop.proxyuser.root.hosts</name><v…

Java+Swing: 主界面组件布局 整理9

说明&#xff1a;这篇博客是在上一篇的基础上的&#xff0c;因为上一篇已经将界面的框架搭好了&#xff0c;这篇主要是将里面的组件完善。 分为三个部分&#xff0c;北边的组件、中间的组件、南边的组件 // 放置北边的组件layoutNorth(contentPane);// 放置中间的 Jtablelayou…

Tair(3):Tair入门demo

新建一个maven项目 1 导入依赖 <dependency><groupId>com.taobao.tair</groupId><artifactId>tair-client</artifactId><version>2.3.5</version></dependency><dependency><groupId>com.alibaba</groupId>…

Linux权限(用户角色+文件权限属性)

Linux权限 文章目录 Linux权限一.文件权限1.快速掌握修改权限的方法&#xff08;修改文件权限属性&#xff09;2.对比权限的有无&#xff0c;以及具体的体现3.修改权限的第二套方法&#xff08;修改用户角色&#xff09;4.文件类型&#xff08;Linux下一切皆文件&#xff09; 二…

049:VUE 引入jquery的方法和配置

第049个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

springboot基础(80):redis geospatial的应用

文章目录 前言redis geospatial如何从地图上获取经纬度springboot 的相关方法调用准备redis服务器引用的依赖预设位置的keyGEOADD 添加位置GEORADIUS 获取指定经纬度附件的停车场&#xff08;deprecated&#xff09;GEORADIUS 获取指定成员附件的停车场&#xff08;deprecated&…

文心一言API(高级版)使用

文心一言API高级版使用 一、百度文心一言API(高级版)二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、百度文心一言API(高级版) 基于百度文心一言语言大模型的智能文本对话AI机器…

归并排序--分治法

代码 #include<iostream> using namespace std;void merge(int arr[], int p, int q, int r, int temp[]) {int i p;int j q 1;int k 0;while (i < q && j < r){if (arr[i] < arr[j]){temp[k] arr[i];}else{temp[k] arr[j];}}while (i < q){t…

智能优化算法应用:基于蚁狮算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蚁狮算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蚁狮算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蚁狮算法4.实验参数设定5.算法结果6.参考文献7.MA…

ptmalloc:从内存虚拟化说起

前言 本文并不局限于ptmalloc的原理&#xff0c;而是从linux的内存虚拟化和系统调用原理出发&#xff0c;结合各种语言实现&#xff0c;讲明内存分配方面的trade off&#xff0c;力图事无巨细&#xff0c;追根究底。本文内容包括但不限于&#xff1a;NIO原理、0拷贝原理、内存…

leetcode:643. 子数组最大平均数 I(滑动窗口)

一、题目 链接&#xff1a;643. 子数组最大平均数 I - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a; double findMaxAverage(int* nums, int numsSize, int k) 二、思路 滑动窗口&#xff1a; 先计算数组前k个元素总和&#xff0c;作为第一个窗口&#xff0c;默…

vlog如何降低重复率

大家好&#xff0c;今天来聊聊vlog如何降低重复率&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; vlog如何降低重复率 Vlog作为一种流行的视频日志形式&#xff0c;常常被人们用于记录日常生活、分享经…