代码编织梦想

mvc介绍

mvc是一种框架,该框架的思想为分工
就是将一份大工程拆分为若干个小工程,每个工程只负责该部分的内容
mvc的核心是解耦

mvc工作原理

在这里插入图片描述
如图,用户在浏览器上提交一个表单,c控制器接受到,发送给m,m将表单数据添加到数据库中,然后c控制器在让v产生html文件然后返回浏览器页面

  • m:model模型,用于和数据库进行交互
  • v:视图,用于产生html页面
  • c:控制器,用与接受、发送数据,沟通进行处理,与m、v交互,返回应答

Django简介

Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。2019年12月2日,Django 3. 0发布

MTV框架模式

在这里插入图片描述

  • m:与mvc框架中m一样用于与数据库进行交互
  • t:和mvc中的v功能一样,用于产生html
  • v:用于接受,和m、t进行交互,返回数据

python虚拟环境

因为在我们开发的是否,通常是有多个项目的,但有的项目需要依赖于python的这个版本,
另一项项目需要依赖于另一个python版本
又因为在我们python中,在安装了一个新版本后会将前一个版本进行覆盖
这时候我们要先对之前的那个项目进行测试时就没办法,
这时候我们就需要用到oython的虚拟环境

虚拟环境

顾名思义,虚拟环境就是一个虚拟的,它模拟了你真是的环境,包含了所有功能,但在虚拟环境中安装的包、模块一类的只存在于当前虚拟环境中,和你本机中的python环境并不冲突,只能在虚拟环境中使用。

安装虚拟环境

想要创建虚拟环境首先需要安装virtualenv包和virtualenvvmrapper包
保证ubantu 能够联网

  • sudo pip3 install virtualenv :安装虚拟环境
  • sudo pip3 install virtualenvwrapper:安装虚拟环境扩展包
  • 进入家目录配置.bashrc文件
    在文件底部加入
    export WORK_HOME=$HOME/.virtualenvs
    用于设置虚拟环境路径
    source /usr/local/bin/virtualenvwrapper.sh
  • 使用source .bashrc命令设配置文件生效

虚拟环境操作

  • 创建虚拟环境
    mkvirtualenv 名字
    创建python3的虚拟环境
    mkvirtualenv -p python3 名字

  • 进入虚拟环境
    workon 虚拟环境名

  • 查看虚拟机环境
    workon 两个tab
    -退出虚拟环境
    deactivate

  • 删除虚拟环境
    rmvirtualenv 虚拟环境名

  • 虚拟环境下安装包
    pip install 包名

  • 查看虚拟环境中安装的包
    pip list
    pip freeze

Django创建和使用

创建Django

命令:

django-admin startproject 项目名

项目目录:
在这里插入图片描述

  • _init_:表示这是一个可导入的包
  • setting.py:项目的配置文件
  • urls.py:进行文件的路由设置
  • wsgi.py:web服务器和Django交互的接口
  • manage.py:项目的管理文件

创建应用

通常在一个项目中由多个模块组成,项目的每一个功能都是一个应用
命令:

python/python3  manage.py startapp 应用名

应用目录:
在这里插入图片描述

  • models.py:模块文件,用于与数据库进行交互
  • tests.py: 用于测试人员进行测试使用
  • views.py:用于与T、M进行交互,收发数据
  • admin.py:用于配置后台管理接口

将应用绑定到项目

进入setting.py文件
在这里插入图片描述
将应用名加入到该元组中实现应用的绑定

启动服务器

Django 框架自带了一个web服务器
命令:

python3 manage.py runserver

模型

orm介绍

orm是一种思想,该思想解决类在python中频繁的调用数据时端麻烦
使用orm思想,再次需要执行数据库操作时只需通过创建一个对象并调用响应的方法即可
orm实现,是一个类,类名为该数据表的表名,类里的类属性为数据表中的字段
Django框架中对数据库的使用就是应用了这个思想

表的创建

在models.py文件中
定义一个类该类需要继承models.Model类
该类就属于一个模型类
在这里插入图片描述设计表中的数据
定义了一个bookinfo表,表中有两个字段

模型类生成表

上一步只是在模型类中定义了一个表,要想将该表存到数据库中需要,生成迁移文件、迁移文件两个不住

  • 生成迁移文件
    命令:python3 manage.py makemigrations
    生成的迁移文件存储在migrations文件夹中
    在这里插入图片描述
  • 执行迁移表命令
    该命令用于将迁移文件迁移到数据库
    命令:python3 manage.py migrate

通过模型类操作数据库

首先需要导入模型类

添加数据

创建数据库对象
在这里插入图片描述
通过实例对象操作类属性添加实例属性
最后调用save()方法添加数据

ForeignKey(关联数据表名);
定义关联外键,多表建立联系
在这里插入图片描述

查询数据

通过数据表类查询
数据表类名.objects.get(条件);
查询出来为数据表字段对象
通过类属性来获取记录
在这里插入图片描述
objects.all():查询所有数据

改数据

直接通过数据表字段对象调用属性重新赋值即可
最后徐通过save()方法再次提交一下即可

删除数据

通过数据表记录字段对象
调用delect()方法即可

后台管理

后台管理是开发者在浏览器中留的一个对数据进行管理操作的页面,django中实现后台管理需要四个步骤

本地化

配置setting.py文件将时区和语言设置为中国的
中国语言:zh-hans;
中国时区:Asia/Shanghai
在这里插入图片描述

创建管理员

命令

python3 manage.py createsuperuser

根据提示设置管理账号和密码
在这里插入图片描述在这里插入图片描述

注册模型类

创建好后台管理页面后需要将要管理的数据链接到后台
这就需要进行注册模型,来告诉django框架根据注册的模型类来生成对应的管理页面
在admin.py文件中需要进行设置
命令:

admin.site.register(数据表类名)

使用数据表类需要导入数据表类所在的模块

在这里插入图片描述

自定义管理页面

通过定义自定义管理类来控制后台页面的输出
创建一个自定义管理类,继承于admin.ModelAdmin
类里面实现
list_display=[要显示的字段];
在这里插入图片描述

字段属性和选项

模型类中数据类型和mysql数据类型的对应关系

类型:
CharField(max_length) -----> Char: max_length:表示最大字符个数
TextFIeld() -----> Text:
boolleanField()
NullBooleanField()
Inteager() -----> int
DecimalField(max_digits=, decimal_places=): 总数, 小数位;
FloatField ------> float 参数同上
DateField(auto_now = bool, auto_now_add=bool ) -----> Date;
auto_now: 如果设置为ture:则表示该行修改后,该字段值为当前修改时间
auto_now_add : auto_now: 如果设置为ture:则表示该行创建后,该字段值为当前创建时间
这两个参数只能使用其一;

选项
在类型方法中设置
default:默认值;
primary key : 主键
unique:唯一
db_index : 为该字段创建索引
null:如果该值为true则表示该字段允许为空 默认为false
db_column:用于指定表名
blank:如果设置为true则表示该字段允许为空白,默认为false

查询

Django操作数据库中的数据,
通过模型类.objects调用函数对模型类对应的数据表 进行查询

  • get()函数:返回满足条件的一条且只能有一条数据,返回值是一个模型类对象
  • all()函数:返回模型类对应表格中的所有数据,返回值是QuerySet对象
  • filter()函数:返回满足条件的所有数据,返回值是QuerySet对象
    条件格式:模型类属性名__条件名:值
    判等:exact
    BookInfo.objects.filter(id__exact=);
    判等条件可以省略:
    BookInfo.objects.filter(id=);
    模糊查询
    包含----> like “%%”:
    contains=值:表示包含该值
    开头 ----> like “k%”;
    startswith=值
    结尾-----> like “%k”:
    endswith = 值
    空查询
    isnull=bool值
    范围查询
    in=[];
    表示匹配列表中的值
    比较查询
    gt:大于
    lt:小于
    gte:大于等于
    lie:小于等于
    日期查询
    year
    month
    day
  • exclude()函数:返回不满足条件的数据,返回值QuerySet对象
  • order_by :对数据进行排序,返回值为QuerySet对象
    使用:对查询集进行排序
    例:bookinfo.objects.all().order_by("模型类属性”[, “模型类属性”]);
    默认升序排序,将序排序只需要在模型类属性前加-号即可

F对象

使用F对象之前需要进行导入
from django.db.models import F
该对象用于进行模型类属性之间的比较
例:查询阅读量大于评论量的图书
bookInfo.objects.felter(bread__gt=F("bcomment"));	
F可以进行算数运算
例:查询阅读量大于评论量的两倍的数据
bookInfo.objects.felter(bread__gt=F("bcomment")*2);	

Q对象

使用Q对象首先需要导入
from django.db.models import Q
该对象用于进行条件间的逻辑处理
&、|、~
使用:Q(查询条件) 逻辑符号 Q(查询条件);
例:查询性别为男且年龄大于18的学生
student.objects.filter(Q(gender__exact = “男”)&Q(age__gt=18));

聚合函数

使用aggregate(聚合函数)函数进行聚合操作,返回值是一个字典
使用前需要导入相应的聚合函数
from django.db.models import max, min, count, Avg;

例:查询所有图书的数目
from django.db.models import count;
bookinfo.objects.all().aggregate(count(“id”));
返回值是一个字典:key值为 聚合字段名__聚合函数名;
count函数:用于返回该表中的数据个数;返回值是一个数字
例:bookinfo.objects.all().count();

查询集对象

查询集对象可以使用以上的所有属性和方法

查询集的特性

  • 惰性查询
    查询集只有 在实际使用查询集中的数据的是后续才会执行查询
    也就是说,如果你将一个查询的结果使用变量装起来后,则只有调用运行该变量才会执行查询

  • 缓存
    在使用查询集时只有第一次使用查询集的时候才会发生查询,以后再次调用查询集则不在会发生查询,则使用缓存中的结果

操作

可以对查询集进行取下标或者切片操作(下标不允许为负),
进行切片操作会产生一个新的查询集
可以对查询集进行循环遍历
exists()方法:可以判断一个查询集是否为空

模型类之间的关系

一对多

在多类中定义:models.Foreignkey(表类名);

多读多

在那任意类中定义:models.ManyToManyField(另一个类名)

一对一

在任意类中定义: models.OneToOneField(另一个类名);

关联查询

在一对多关系中,一对应的那个类我们成为多类,多对应的那个类成为一类
,我们把多类中 定义的建立联系的类属性称为关联属性
我们普通查询方法如下图:
在这里插入图片描述

通过模型类查询

  • 通过多类查询一类中的数据
    一类名.objects.filter(多类名__多类属性名__查询条件函数);
    例:bookinfo.objects.fileter(heroinfo__hcomment__contains=‘八’):
    查询图书表中英雄的描述中包含八的图书

  • 通过多类查询一类
    多类名.object.filter(关联属性__一类属性名__查询条件函数);
    注意
    1、通过模型类实现关联查询时,要查那个类中的数据就是用那个类来查
    2、写关联条件时,如果类中没有关联属性,则使用对应的类名来查询,
    如果类中有关联属性,则直接使用关联属性

自关联

通过在咋类中加入:ForeignKey(self)创建

管理器对象

objects是django自动帮我们生成的一个管理器对象,通过这个管理器对象我们可以实现查询
objects是models.Manger类的一个对象
我们可以自定义管理器对象

  • 在模型类中
    通过models.Manger对象创建一个管理器对象
    此时默认的obects将失去作用,新的管理器对象生效

  • 自定义Manger类继承于models.Manger类
    自定义管理类应用场景

  • 改变结果集的数据
    通过在自定义的Manger类重写Manger对象的方法,对查询数进行过滤
    例:重写Manger对象的all方法,对数据进行控制

  • 为Manger对象添加额外的方法
    在自定义的Manger类中我们可以添加新方法,对数据进行操作;
    例如:添加添加字段、删除字段的一系列方法

元选项

我们通过模型类创建的表的表名默认是 应用名_类名
这就会导致如果我们修改了应用名,程序就会报错
这就需要使用元选项设置我们的创建的表的表名不再依赖于应用名
元选项:用于设置通过模型类创建的表的表名
使用:在模型类中定义一个Meta类,在里面定义一个db_table属性
指定表名;
设置过,我们再通过模型类创建表时就会使用我们指定的表名进行创建

视图

视图的功能

用于接受用户请求,将接受到的请求与M和T进行交互,返回应答
应答类型:可以返回一个html文件,response对象也可以是一个redirect重定向

视图函数的使用

使用

定义视图函数

定义视图函数时必须要有request参数,该参数是一个HttpRequest对象
在这里插入图片描述

配置url

  • 首先需要在项目目录下创建templates目录
    该目录用于存储应用所使用到的模板文件
    我们一般在该目录下创建一个以应用名命名的子目录,该目录下存储该应用所使用的所有文件,以便区分个应用之间的所使用到的文件
    在这里插入图片描述
  • 在使用之前需要在项目配置文件中设置templates文件的路径
    找到TEMPLATES项,在DIR对应的value中输入os.path.join(BASE_DIR, "templates"即可
    在这里插入图片描述
  • 在项目的urls文件中包含该应用的urls文件
    在这里插入图片描述
  • 在应用目录下创建urls文件,在里面编辑路由信息
    在这里插入图片描述
    该url参数用于为所访问的页面定义指定的url视图文件
  • 在应用的views文件中定义所对应的视图文件
    在该文件下定义所指定的视图函数
    在这里插入图片描述
    如果返回的是模板文件,必须是templates目录下所拥有的文件

URL匹配过程

  • 用户输入所访问文件的地址
  • 将/前的和?后的参数全部去除
  • 将剩下的信息到模板的urls文件中进行匹配
  • 将匹配成功部分去除
  • 将剩下的部分,到url所包含的文件中进行匹配
  • 匹配成功调用所对应的视图函数
  • 模板函数向客户端返回所需要的信息

错误视图

默认情况下我们的DEBUG模式是开启的,该模式下我们如果有错误,会在浏览器中给出提示信息,但在我们的网站发布出去以后,如果还是模式就会导致我们的信息泄露,
我们可以在项目的配置文件中设置是否开启DEBUG模式
在这里插入图片描述
设置为False则关闭

关闭DEBUG模式后,当我们程序出错,django会给出一个默认的错误页面404,我们也可以自定义该页面,直接在templates目录中新建404.html即可,不用进行路由配置,django自动为该文件进行设置了路由

出现404的情况

  • 没有配置url路由
  • url路由配置错误

出现500的情况

  • 视图出错

捕获URL参数

在进行模板文件的编写是有时候需要使用url地址中得信息,
这个时候就需要用到url捕获技术
在进行url匹配时,把需要捕获的部分设置成一个正则表达式组 ,这样django框架就会自动把匹配成功后相应的组的内容传递给所对应的视图函数,在函数中定义一个参数进行接收

  • 位置参数
    参数名可以随意定义
  • 关键字参数
    为该参数定义一个名称
    但在参数中用于接受该值的参数名必须和所定义的名字相同
    在进行url匹配时使用(?p)

request对象

该对象用与存储用户所提交的数据
属性

  • path:用于获取请求页面的完整路径
  • method:用于获取请求方式
  • encoding:用户获取提交数据使用的编码格式
  • GET:用于获取用户使用get方式提交的数据
  • POST:用户获取用户使用post方式提交的数据
  • COOKIES:用于获取用户所有的cookies信息,返回值是一个字典
  • session:用于获取客户的当前会话信息,返回值是一个字典

模板

模板的功能

模板文件用于产生html页面,控制页面上需要显示的内容,模板文件不仅只是一个html文件
模板文件由两部分组成

  • 静态文件:css、js、img
  • 动态文件:用于动态的生成一些网页内容,需要使用模板语言来产生

模板的使用

通常是在视图函数中使用产生的模板文件,返回给客户端
模板文件使用步骤
使用前需要导入django.tempalte import loader

  • 加载模板文件
    通过调用loader.get.template(‘模板路径’)方法,加载模板文件
    返回一个模板对象
  • 定义模板上下文
    通过定义模板上下文,将视图需要传输的数据传递到模板中
    RequestContext(request, {}); 返回一个上下文对象
  • 模板渲染产生 html页面
    用于将视图传输过来的数据和模板中的模板变量进行互换,渲染然后返回一个渲染过的html页面
    模板对象.render(上下文对象);
  • 返回给客户端
    将渲染或的html页面文件,通过Response对象返回到客户端。

模板的加载顺序

  • 首先去配置的模板目录下去寻找要加载的文件
  • 在配置的模板目录下没找到,则在拥有templates目录的所有已定义的应用目录下去寻找
  • 如果都找不到则报错

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/jwefhkjn/article/details/111099443

一些CTF杂项MISC解题脚本-爱代码爱编程

总结发布一些简单CTF中MISC常用的解题脚本,基于python3。目前有二维码解码、mp3隐写、像素提取。 二维码解码 通过pip安装zxing库。 def qr_decode(): """ 二维码解码 :return: """ import zxing reader = zxing.BarCod

Python3 《零基础小白从入门到实战》之“continue 语句”-爱代码爱编程

continue 语句用于循环语句中,跳过满足条件的循环,继续执行下一次循环, 一般和 if 语句 结合使用。 语法格式: while 条件 :        循环体       if 条件 :          continue ------------------------------

leetcode_217. 存在重复元素-爱代码爱编程

目录 一、题目内容 二、解题思路 三、代码 一、题目内容 给定一个整数数组,判断是否存在重复元素。 如果任意一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。 示例 1: 输入: [1,2,3,1] 输出: true 示例 2: 输入: [1,2,3,4]

Django:DjangoRestFramework drf 开发5-爱代码爱编程

9. 模型类序列化器 1. 定义模型类序列化器 模型类序列化器ModelSerializer,继承自SerializerModelSerializer将代码进行了进一步的封装 定义属性,指定类型和参数定义验证方法定义保存方法: create() update()ModelSerializer封装了定义属性,指定类型,定义保存方法使用模型类序列化器

北京大学陈斌老师---计算和控制流上机程序-爱代码爱编程

T1 求1!+2!+,,,+n! # T1方法一 求1!+2!+,,,+n! n = int(input("请输入n")) al = 0 for i in range(1, n+1): b = 1 # 每次都会将b更新 for j in range(1, i+1): b = j*b # i的阶乘 p

列表内套用字典、元组的排序问题-爱代码爱编程

列表中排序问题 .sort()只是针对列表的排序,非列表的情况下,用list()强制转换格式。sort后的参数不能是位置参数,例如下标, 以下为列表数据按字典key的值排序 lambda函数形式: students = [ {'name': 'TOM', 'age': 20}, {'name': 'ROSE', 'age': 19}

使用子查询统计每个客户预订线路的数量,要求按照预订线路数升序显示客户姓名和预订线路数-爱代码爱编程

查看本章节 查看作业目录 需求说明: 使用子查询统计每个客户预订线路的数量,要求按照预订线路数升序显示客户姓名和预订线路数在国外旅游淡季时节,所有“出境游”线路的价格下调 10%实现思路:  需求说明(1)的解决思路 在订单客户表中,根据出行客户编号分组获取每一个客户的预订线路数,查询结果作为 from 子句的虚拟表 A连接客户表和虚拟表 A,连

数据库设计规范与设计工具-爱代码爱编程

数据库的设计要遵守三范式来设计,这样的设计的好处是可以消除数据冗余,缺点是增加了sql语句的难度。因此,我们在设计表结构的时候不一定要完全遵守三范式,如果遇到复杂问题,可以尝试着打破三范式找到解决问题或优化性能的方法。 一、三范式 第一范式 表中的字段要保持原子性,即字段不可再分 eg 学生信息表中的联系方式有两种——邮箱和电话

2020-12-13-爱代码爱编程

文章目录 今日内容数据库的基本概念MySQL数据库软件SQLDDL:操作数据库、表DML:增删改表中数据DQL:查询表中的记录 今日内容 数据库的基本概念 MySQL数据库软件 安装卸载配置 SQL 数据库的基本概念 数据库的英文单词: DataBase 简称 : DB 什么数据库? 用于存储和管理数据的仓库。 数据库的

Canal+Kafka实现mysql与Redis数据同步-爱代码爱编程

Canal+Kafka实现mysql与Redis数据同步 一、Canal简介 canal主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费,早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍

SpringBoot系列:5.项目中使用多个数据库-爱代码爱编程

内容概述 本文简要介绍下,当项目使用多个数据库的时候,druid如何配置。 文章目录 在之前的文章,SpringBoot系列:1.快速搭建web api项目,提到可以通过很简单的配置实现数据库的访问,例如: spring: datasource: druid: url: jdbc:mysql://localhost:3306

python Flask配置mysql数据库使用-爱代码爱编程

第一步 创建Flask pip install flask 成功安装之后如app.py from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'hello world' if __name__ == '__main__':