计算机基础知识66

news2024/11/29 10:51:58

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 AbstractUser

class UserInfo(AbstractUser):
    # 扩写字段---》手机号,头像,
    phone = models.CharField(max_length=32)
    # /media/avatar/default.png
    # 必须安装pillow 才能使用 ImageField
    avatar = 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.username

class 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_title
        except Exception as e:
            return self.site_title

class 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.name

class 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.name

class 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.title

class 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_up

class 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=True
    parent_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.coloradmin.cn/o/1299971.html

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

相关文章

m.2固态硬盘怎么选择?

一、什么是固态硬盘 固态硬盘又称SSD&#xff0c;是Solid State Drive的简称&#xff0c;由于采用了闪存技术&#xff0c;其处理速度远远超过传统的机械硬盘&#xff0c;这主要是因为固态硬盘的数据以电子的方式存储在闪存芯片中&#xff0c;不需要像机械硬盘那样通过磁头读写磁…

智能制造和低代码:打造高效工厂的关键

引言 随着全球制造业进入数字化时代&#xff0c;智能制造和低代码技术已经成为实现高效工厂运营的关键。这两个关键因素的融合为制造业带来了巨大的机会&#xff0c;使企业能够更灵活地应对市场需求、提高生产效率和降低成本。本文将深入探讨智能制造和低代码技术如何共同塑造…

Java到底是什么?学了我们能做什么?

一、Java是什么&#xff1f; Java是一门面向对象编程语言&#xff0c;不仅吸收了C语言的各种优点&#xff0c;还摒弃了C里难以理解的多继承、指针等概念&#xff0c;因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表&#xff0c;极好地实…

力扣257. 二叉树的所有路径(递归回溯与迭代)

题目&#xff1a; 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;["1->2->5","…

Java简易版:UDP协议实现群聊

要先 运行服务端&#xff0c;在运行客户端&#xff0c;否则会报错。 服务端&#xff1a; package 二十一章;import java.io.*; import java.net.*; import java.util.ArrayList; public class T{public static ServerSocket server_socket;public static ArrayList<Socket…

CMake是什么

文章目录 一.什么是CMake二.CMake安装三.CMake一个HelloWord-的语法介绍3.1 PROJECT关键字3.2 SET关键字3.3 MESSAGE关键字3.4 ADD_EXECUTABLE关键字3.5 include_directories关键字3.6 aux_source_directory 四.语法的基本原则4.1 语法注意事项 五.内部构建和外部构建5.1 外部构…

Python:核心知识点整理大全11-笔记

目录 ​编辑 6.2.4 修改字典中的值 6.2.5 删除键—值对 注意 删除的键—值对永远消失了。 6.2.6 由类似对象组成的字典 6.3 遍历字典 6.3.1 遍历所有的键—值对 6.3.2 遍历字典中的所有键 往期快速传送门&#x1f446;&#xff08;在文章最后&#xff09;&#xff1a; 6.…

file-saver 的使用

简介 FileSaver.js 是在客户端保存文件的解决方案&#xff0c;非常适合在客户端生成文件的 Web 应用程序 基本使用 以下内容基于官方文档&#xff0c;官方文档传送门https://gitcode.net/mirrors/eligrey/FileSaver.js 注意&#xff1a;存在文件保存的大小限制&#xff0c;具…

入门深度学习真的这么难吗?

今天微信私信回答了一个同学的问题&#xff1a;&#xff1f;我在入门深度学习的过程中&#xff0c;从配环境到 debug 全是坑&#xff0c;解决问题的时间远超跑模型的时间&#xff0c;为什么入门深度学习这么难&#xff1f; 这个问题真的问到我的心坎里了&#xff0c;我只能说&…

Python轴承故障诊断 (二)连续小波变换CWT

目录 前言 1 连续小波变换CWT原理介绍 1.1 CWT概述 1.2 CWT的原理和本质 2 基于Python的CWT实现与参数对比 2.1 代码示例 2.2 参数介绍和选择策略 2.2.1 尺度长度&#xff1a; 2.2.2 小波函数&#xff08;wavelet&#xff09;&#xff1a; 2.3 凯斯西储大学轴承数据的…

御剑工具学习

御剑 1.1 工具的下载路径1.2 工具的安装流程1.3 工具的详细使用 1.1 工具的下载路径 百度网盘 链接&#xff1a;https://pan.baidu.com/s/1Bn7GtWb7AStcjzVahFOjSQ 提取码&#xff1a;zkaq 1.2 工具的安装流程 御剑不用安装&#xff0c;直接下载下来解压&#xff0c;双击“御…

【Java实现百钱买百鸡的两种写法】

Java实现百钱买百鸡的两种写法 Java双重嵌套for循环实现百钱买百鸡的写法&#xff08;一&#xff09;Java三重嵌套for循环实现百钱买百鸡的写法&#xff08;二&#xff09; Java双重嵌套for循环实现百钱买百鸡的写法&#xff08;一&#xff09; //定义一个记录循环次数变量int …

C语言指针基础题(一)

目录 例题一题目解析答案 例题二题目解析答案 例题三题目解析答案 例题四题目解析答案 例题五题目解析答案 例题六题目解析答案 例题七题目解析答案 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x…

202301209将RK3399的挖掘机开发板在Android10下设置系统默认为24小时制

202301209将RK3399的挖掘机开发板在Android10下设置系统默认为24小时制 2023/12/9 22:07 应该也可以适用于RK3399的Android12系统 --- a/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/frameworks/base/packages/SettingsProvider/res/values/default…

docker安装node及使用

文章目录 一、安装node二、创建node容器三、进入创建的容器如有启发&#xff0c;可点赞收藏哟~ 一、安装node 查看可用版本 docker search node安装最新版本 docker install node:latest二、创建node容器 docker run -itd --name node-test node–name node-test&#xff1…

10款装系统启动工具

1、GhostWin10 PE&#xff1a; GhostWin10 PE主要适用于安装Windows 10操作系统。它是一个基于Ghost Win10制作的PE系统&#xff0c;提供了安装Windows 10的功能 2、老毛桃PE&#xff1a; 老毛桃PE适用于各种Windows操作系统的安装和修复。它是一个基于Windows PE环境的工具…

epoll实现同时承载100w客户端的数量

概念 先表明&#xff0c;这里是让epoll能够同时承受100w的连接&#xff0c;不针对业务处理。 对于百万并发的业务处理&#xff0c;其前提条件就是要同时承受住100w的连接。 程序源码 epoll的源码直接给出来 /*支持百万并发的 reactor1.其主要限制在于Linux系统的限制,需要修改一…

小白教学!几个步骤入门AI动画视频制作

公众号&#xff1a;算法一只狗 文章目录 文本视频生成软件&#xff1a;PIKA小黑子表情包熊猫头表情包 动画视频制作故事和分镜文本制作动画生成与拼接 总结 要介绍动画生成之前&#xff0c;先让大家来看看我生成的动画视频&#xff1a; AI动画生成故事 上面的视频我只用了不到2…

Android12 WIFI 无法提供互联网连接

平台 RK3588 Android 12 问题描述 ConnectivityService是Android系统中负责处理网络连接的服务之一。它负责管理设备的网络连接状态&#xff0c;包括Wi-Fi、移动数据、蓝牙等。 在Android系统中&#xff0c;ConnectivityService提供了一些关键功能&#xff0c;包括但不限于…

Docker部署开源分布式任务调度平台DolphinScheduler并实现远程访问办公

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…