开发知识点-Django

Django
- 1 了解简介
- 2 Django项目结构
- 3 url 地址 和视图函数
- 4 路由配置
- 5 请求及响应
- 6 GET请求和POST请求
- 查询字符串
- 7 Django设计模式及模板层
- 8 模板层-变量和标签
- 9 模板层-过滤器和继承
- 继承 重写
- 10 url反向解析
- 11 静态文件
- 12 Django 应用及分布式路由
- 创建之后 注册 一下
- 13 模型层及ORM介绍
- 同步表结构
- 默认 初始化 id 自增
- 14 ORM-基础字段及选项
- django 模型models 常用字段
- 布尔型
- 变长字符
- 继承 Model 类属性
- 表明 app_模型类名
- 表 列 字段
- 15 ORM-基本操作-创建数据
- python3.7 mysql 部署 问题
- 只执行 增量 文件
- 对象 初始化 再 save
- 引進模型類
- P16 ORM-查询操作
- 模型 類 數組 循環 索引 切片 的 操作
- 類數組 [ <Object (id) > , ...... ]
- 不再是 类的 实例化对象 object
- 取值 用 字典 取 key 的 这种方式
- 元组 用 索引取值
- .all 的 排序 返回 object
- 灵活 组合 顺序 不用想
- locals 把 视图函数 的 局部变量 传到 视图里
- 结构 的 元素 表现形式 要注意 object 字典 元组
- 17 ORM-查询操作
- 条件查询
- P46 8.04-项目部署-uwsgi
- CentOS7安装uwsgi遇到的坑
- P47 8.05-项目部署-nginx
- 看日志
- P48 8.06-项目部署-nginx
- 关联查询
- on_delete参数的各个值的含义:
- Django常用的QuerySet操作
- 前后端分离跨域方案
- 跨域请求存在诸多安全问题,例如CSRF攻击等,
- 解决方案
- Django中如何使用CORS
- 打开cmd,执行命令:pip install django-cors-headers
- 修改django项目中的setting.py,
- centos django uwsgi 指定版本
- 系统版本
- 编译:
- 安装:
- 然后进行软链接、系统便能够识别uwsgi命令
- 使用Django生成验证码 并发送qq邮箱
https://www.bilibili.com/video/BV1vK4y1o7jH?from=search&seid=7358572781939588281
1 了解简介




flask 轻
手机游戏

请求响应 路由
MTV设计结构
HTTP状态的 cookie session











解释器 版本








2 Django项目结构

完善的 内部组件










ctrl shift T 新启终端



服务
地址 协议 状态码
前台服务 启动效果







默认数据库 存储 文件








项目目录
配置文件
路由文件
上线项目 运行文件

内置功能 运行规则 flask 就无
注意 格式




绝对路径

项目 绝对 路径






区分 虚拟网站 (一个 服务器 挂 好几个 网站 )




ctrl shift d 新建终端






应用

中间件

配置 主路由文件
模板


语言 配置
时区


东八区 UTC/GMT+08:00




3 url 地址 和视图函数

协议 域名 ip 端口 路由 ?查询字符串 # 锚点








服务 在 主路由 中 配置好 参数 中 视图函数 写好
请求来了 就会有 相应的 响应

来个伪代码 顶替一下 视图函数


把 http 请求 抽象成 HTTPrequest 对象
给 request 函数


相对导入



4 路由配置














%s int + 字符串 %d

path 中 在 数组中 从上到下 匹配







\d 一到两位
\w+ 字符









精准匹配




path <> path转换器
repath 升级版
5 请求及响应




请求 路由 协议







增量开发


























6 GET请求和POST请求





查询字符串
防止 明文传递 敏感数据

参数字典
get取值 默认值







500 响应
























7 Django设计模式及模板层




Controller — 主路由



引擎 数据怎么来 怎么调用
把 Templates 位置 配置到 DIRS 里
















8 模板层-变量和标签





















ctrl alt L 格式化

局部变量 locals


















9 模板层-过滤器和继承













HTML 转义 <> 进行 转义














继承 重写









10 url反向解析





















动态 解析






11 静态文件








注意 元组 中的 逗号




























12 Django 应用及分布式路由


解耦企业业务 每个文件夹 都是 独立的 MTV




创建之后 注册 一下




















13 模型层及ORM介绍





npm run lint -- --fix pip install pymysql






















同步表结构




默认 初始化 id 自增






14 ORM-基础字段及选项












django 模型models 常用字段
1、models.AutoField 自增列 = int(11)如果没有的话,默认会生成一个名称为 id 的列如果要显式的自定义一个自增列,必须设置primary_key=True。2、models.CharField 字符串字段必须设置max_length参数3、models.BooleanField 布尔类型=tinyint(1)不能为空,可添加Blank=True4、models.ComaSeparatedIntegerField 用逗号分割的数字=varchar继承CharField,所以必须 max_lenght 参数5、models.DateField日期类型 dateDateField.auto_now:保存时自动设置该字段为现在日期,最后修改日期DateField.auto_now_add:当该对象第一次被创建是自动设置该字段为现在日期,创建日期。6、models.DateTimeField 日期时间类型 datetime同DateField的参数7、models.Decimal 十进制小数类型 = decimalDecimalField.max_digits:数字中允许的最大位数DecimalField.decimal_places:存储的十进制位数8、models.EmailField 一个带有检查 Email 合法性的 CharField9、models.FloatField 浮点类型 = double10、models.IntegerField 整形11、models.BigIntegerField 长整形integer_field_ranges = {'SmallIntegerField': (-32768, 32767),'IntegerField': (-2147483648, 2147483647),'BigIntegerField': (-9223372036854775808, 9223372036854775807),'PositiveSmallIntegerField': (0, 32767),'PositiveIntegerField': (0, 2147483647),}12、models.GenericIPAddressField 一个带有检查 IP地址合法性的 CharField13、models.NullBooleanField 允许为空的布尔类型14、models.PositiveIntegerFiel 正整数15、models.PositiveSmallIntegerField 正smallInteger16、models.SlugField 减号、下划线、字母、数字17、models.SmallIntegerField 数字数据库中的字段有:tinyint、smallint、int、bigint18、models.TextField 大文本。默认对应的form标签是textarea。19、models.TimeField 时间 HH:MM[:ss[.uuuuuu]]20、models.URLField 一个带有URL合法性校验的CharField。21、models.BinaryField 二进制存储二进制数据。不能使用filter函数获得QuerySet。22、models.ImageField 图片ImageField.height_field、ImageField.width_field:如果提供这两个参数,则图片将按提供的高度和宽度规格保存。该字段要求 Python Imaging 库Pillow。会检查上传的对象是否是一个合法图片。23、models.FileField(upload_to=None[, max_length=100, ** options])文件FileField.upload_to:一个用于保存上传文件的本地文件系统路径,该路径由 MEDIA_ROOT 中设置这个字段不能设置primary_key和unique选项.在数据库中存储类型是varchar,默认最大长度为10024、models.FilePathField(path=None[, math=None, recursive=False, max_length=100, **options])FilePathField.path:文件的绝对路径,必填FilePathField.match:用于过滤路径下文件名的正则表达式,该表达式将用在文件名上(不包括路径)。FilePathField.recursive:True 或 False,默认为 False,指定是否应包括所有子目录的路径。例如:FilePathField(path="/home/images", match="foo.*", recursive=True)将匹配“/home/images/foo.gif”但不匹配“/home/images/foo/bar.gif” 2. django 模型models 字段常用参数1、null如果是True,Django会在数据库中将此字段的值置为NULL,默认值是False2、blank如果为True时django的 Admin 中添加数据时可允许空值,可以不填。如果为False则必须填。默认是False。null纯粹是与数据库有关系的。而blank是与页面必填项验证有关的3、primary_key = False主键,对AutoField设置主键后,就会代替原来的自增 id 列4、auto_now 和 auto_now_addauto_now 自动创建---无论添加或修改,都是当前操作的时间auto_now_add 自动创建---永远是创建时的时间5、choices一个二维的元组被用作choices,如果这样定义,Django会select box代替普通的文本框,并且限定choices的值是元组中的值GENDER_CHOICE = ((u'M', u'Male'),(u'F', u'Female'),)gender = models.CharField(max_length=2,choices = GENDER_CHOICE)6、max_length字段长度7、default默认值8、verbose_name Admin中字段的显示名称,如果不设置该参数时,则与属性名。9、db_column 数据库中的字段名称10、unique=True 不允许重复11、db_index = True 数据库索引12、editable=True 在Admin里是否可编辑13、error_messages=None 错误提示14、auto_created=False 自动创建15、help_text 在Admin中提示帮助信息16、validators=[]验证器17、upload-to文件上传时的保存上传文件的目录

布尔型
变长字符














继承 Model 类属性







表明 app_模型类名




表 列 字段







15 ORM-基本操作-创建数据





python3.7 mysql 部署 问题

- 不要看 这个解决方案 有问题 还是 decode

只执行 增量 文件









对象 初始化 再 save





引進模型類








P16 ORM-查询操作





模型 類 數組 循環 索引 切片 的 操作
模型類對象 取中的 屬性




類數組 [ <Object (id) > , … ]






不再是 类的 实例化对象 object


取值 用 字典 取 key 的 这种方式

元组 用 索引取值




.all 的 排序 返回 object

灵活 组合 顺序 不用想




locals 把 视图函数 的 局部变量 传到 视图里







结构 的 元素 表现形式 要注意 object 字典 元组
17 ORM-查询操作

条件查询





P46 8.04-项目部署-uwsgi









CentOS7安装uwsgi遇到的坑
错误原因:没有装 python-dev
注意: cnetos系统下,并不是交python-dev,而是叫python-devel
由于我的python版本是3.6.7的,所以我这里安装的是python36-devel
yum install python36-devel
yum install uwsgi
通过 yum search python3 可以搜索出python3有关的包

然后可以进行安装 uwsgi 这么解决 by:aming 2021/09/28





















P47 8.05-项目部署-nginx




Kill -9




















location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:xxxx; #端口要和uwsgi里配置的一样
uwsgi_param UWSGI_SCRIPT quwan_app.wsgi; #wsgi.py所在的目录名+.wsgi
uwsgi_param UWSGI_CHDIR /www/wwwroot/www.xxxx.top/; #项目路径
}
location /static/ {
alias /www/wwwroot/www.xxxx.cn/static/media/; #静态资源路径
}






看日志



kill掉 端口 进程 和 ini启动的 进程




P48 8.06-项目部署-nginx









































gradlew processDebugManifest --stacktrace
python -m django --version
pip freeze > requirements.txt

留意:
使用Python项目管理插件新建项目成功之后,会自动在项目j源码目录里创建一个虚拟环境,虚拟环境目录一般都是以项目名_venv形式命名的。
进入虚拟环境方法:
在命令行输入 source 项目路径/项目名_venv/bin/activate 如:
source /www/wwwroot/myblog/myblog_venv/bin/activate
项目管理器默认使用pip安装项目根目录requirements.txt内的模块,这也是之前我强调把环境依赖包文件放到项目目录下的原因,如有其他模块需要安装请手动进入虚拟环境安装。
#把APP静态资源收集到指定的目录下,这里我收集到static目录下
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
之后在SSH终端进入项目虚拟环境:
source /www/wwwroot/myblog/myblog_venv/bin/activate

出现项目名_venv这个标记,才说明已经成功进入虚拟环境。
然后我们使用下面的命令收集静态文件:
python manage.py collectstatic
关联查询
on_delete参数的各个值的含义:
on_delete=None, # 删除关联表中的数据时,当前表与其关联的field的行为
on_delete=models.CASCADE, # 删除关联数据,与之关联也删除
on_delete=models.DO_NOTHING, # 删除关联数据,什么也不做
on_delete=models.PROTECT, # 删除关联数据,引发错误ProtectedError
# models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)
on_delete=models.SET_NULL, # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)
# models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')
on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)
on_delete=models.SET, # 删除关联数据,a. 与之关联的值设置为指定值,设置:models.SET(值)b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

Django常用的QuerySet操作
Django常用的QuerySet操作在这里我根据是否支持链式调用分类进行介绍1. 支持链式调用的接口
all
使用频率比较高,相当于SELECT * FROM table 语句,用于查询所有数据。filter
使用频率比较高,根据条件过滤数据,常用的条件基本上字段等于、不等于、大于、小于。当然,还有其他的,比如能修改成产生LIKE查询的:Model.objects.filter(content__contains="条件")。exclude
与filter是相反的逻辑reverse
将QuerySet中的结果倒叙排列distinct
用来进行去重查询,产生SELECT DISTINCT这样的SQL查询none
返回空的QuerySet2. 不支持链式调用的接口
get
比如Post.objects.get(id=1)用于查询id为1的文章:如果存在,则直接返回对应的Post实例;如果不存在,则抛出DoesNotExist异常。所以一般情况下,要使用异常捕获处理:1 try:
2 post = Post.objects.get(id=1)
3 except Post.DoesNotExist:
4 #做异常情况处理
create
用来直接创建一个Model对象,比如post = Post.objects.create(title="一起学习")。get_or_create
根据条件查找,如果没查找到,就调用create创建。update_or_create
与get_or_create相同,只是用来做更新操作。count
用于返回QuerySet有多少条记录,相当于SELECT COUNT(*) FROM table 。latest
用于返回最新的一条记录,但要在Model的Meta中定义:get_latest_by= <用来排序的字段>。earliest
同上,返回最早的一条记录。first
从当前QuerySet记录中获取第一条。last
同上,获取最后一条。exists
返回True或者False,在数据库层面执行SELECT (1) AS "a" FROM table LIMIT 1的查询,如果只是需要判断QuerySet是否有数据,用这个接口是最合适的方式。不要用count或者len(queryset)这样的操作来判断是否存在。相反,如果可以预期接下来会用到QuerySet中的数据,可以考虑使用len(queryset)的方式来做判断,这样可以减少一次DB查询请求。bulk_create
同create,用来批量创建记录。in_ bulk
批量查询,接收两个参数id_ list和filed_ name。可以通过Post.objects. in_ bulk([1, 2, 3])查询出id为1、2、3的数据,返回结果是字典类型,字典类型的key为查询条件。返回结果示例: {1: <Post 实例1>, 2: <Post实例2>,3:<Post实例3>}。update
用来根据条件批量更新记录,比如: Post.objects.filter(owner__name='123').update(title='测试更新')。delete
同update,这个接口是用来根据条件批量删除记录。需要注意的是,和delete都会触发Djiango的signalvalues
当我们明确知道只需要返回某个字段的值,不需要Model实例时,用它,用法如下:1 title_list = Post.objects.filter(category_id=1).values('title')
返回的结果包含dict的QuerySet,类似这样: <QuerySet [{'title' :xxx},]>values_list
同values,但是直接返回的是包含tuple的QuerySet:1 titles_list = Post.objects.filter(category=1).values_list('title')
返回结果类似: <QuerySet[("标题",)]>如果只是一个字段的话,可以通过增加flat=True参数,便于我们后续 处理:1 title_list = Post.objects.filter(category=1).values_list('title',flat=True)
2 for title in title__list:
3 print(title)
2.1进阶接口
除了上面介绍的常用接口外,还有其他用来提高性能的接口,在下面介绍。 在优化Django项目时,尤其要考虑这几种接口的用法。defer
把不需要展示的字段做延迟加载。比如说,需要获取到文章中除正文外的其他字段,就可以通过posts = Post.objects.all() .defer('content'),这样拿到的记录中就不会包含content部分。但是当我们需要用到这个字段时,在使用时会去加载。代码:1 posts = Post.objects.all().defer('content')
2 for post in posts: #此时会执行数据库查询
3 print (post.content) #此时会执行数据查询,获取到content
当不想加载某个过大的字段时(如text类型的字段),会使用defer,但是上面的演示代产生N+1的查询问题,在实际使用时千万要注意!注意:上面的代码是个不太典型的 N+1查询的问题, 一般情况下 由外键查询产生的N+1问题比较多,即一条查询请求返回N条数据,当我们操作数据时,又会产生额外的请求。这就是N+1问题,所有的ORM框架都存在这样的问题。only
同defer接口刚好相反, 如果只想获取到所有的title记录,就可以使用only,只获取title的内容,其他值在获取时会产生额外的查询。select_related
这就是用来解决外键产生的N+1问题的方案。我们先来看看什么情况下会产生这个问题:posts = Post.objects.all ()
for post in posts: #产生数据库查询print (post.owner) #产生额外的数据库查询
代码同上面类似,只是这里用的是owenr(是关联表)。它的解决方法就是用select_ related接口:post = Post.objects.all() .select_related('category')
for post in posts: # 产生数据库查询,category数据也会一次性查询出来print (post.category)
当然,这个接口只能用来解决一对多的关联关系。对于多对多的关系,还得使用下面的接口。prefetch_related
针对多对多关系的数据,可以通过这个接口来避免N+1查询。比如,post和tag的关系可以通过这种方式来避免:posts = Post.objects.all().prefetch_related('tag')
for post in posts:#产生两条查询语句,分别查询post和tagprint(post.tag.al1())
3.常用的字段查询
contains
包含,用来进行相似查询。icontains
同contains,只是忽略大小写。exact
精确匹配。iexact
同exact,忽略大小写。in
指定某个集合,比如Post.objects.filter(id__in=[1, 2, 3])相当于SELECT FROM table WHERE IN (1, 2, 3);。gt
大于某个值。比如:Post.objects.filter(id__gt=1)注意:是__gtgte
大于等于某个值。lt
小于某个值。lte
小于等于某个值。startswith
以某个字符串开头,与contains类似,只是会产生LIKE '<关键词>%'这样的SQL。istartswith
同startswith, 忽略大小写。endswith
以某个字符串结尾。iendswith
同endswith,忽略大小写。range
范围查询,多用于时间范围,如Post.objects.filter(created_time__range= ('2018-05-01','2018-06-01'))会产生这样的查询: SELECT .. . WHERE created_ time BETWEEN '2018-05-01' AND '2018-06-01' ;。关于日期类的查询还有很多,比如date、year和month等,具体等需要时查文档即可。这里你需要理解的是,Django之所以提供这么多的字段查询,其原因是通过ORM来操作数据库无法做到像SQL的条件查询那么灵活。因此,这些查询条件都是用来匹配对应SQL语句的,这意味着,如果你知道某个查询在SQL中如何实现,可以对应来看Django提供的接口。3.1 进阶查询
除了上面基础的查询语句外,Django还提供了其他封装,来满足更复杂的查询,比如 SELECT ... WHERE id = 1 OR id = 2 这样的查询,用上面的基础查询就无法满足。F
F表达式常用来执行数据库层面的计算,从而避免出现竞争状态。比如需要处理每篇文章的访问量,假设存在post.pv这样的字段,当有用户访问时,我们对其加1:post = Post.objects.get(id=1)
post.pv = post.pv+1
post.save()
这在多线程的情况下会出现问题,其执行逻辑是先获取到当前的pv值,然后将其加1后赋值给post .pv.最后保存。如果多个线程同时执行了post = Post.objects.get(id=1),那么每个线程里的post .pv值都是一样的, 执行完加1和保存之后,相当于只执行了一个加1,而不是多个。这时通过F表达式就可以方便地解决这个问题:from ajango.ab. models import F
post = Post.objects.get(id=1)
post.pv = F('pv') + 1
post.save():
这种方式最终会产生类似这样的SQL语句: UPDATE table SET pv = pv +1 WHERE ID = 1。 它在数据库层面执行原子性操作。Q
Q表达式就是用来解决前面提到的那个OR查询的,可以这么用:from django.db.mode1s import Q
Post.objects.filter(Q(id=1) | Q(id=2))
或者进行AND查询:Post.objects.filter(Q(id=1) & Q(id=2))
Count
用来做聚合查询,比如想要得到某个分类下有多少篇文章,简单的做法就是:category = Category.objects.get(id=1)
posts_count = category.post_set.count()
但是如果想要把这个结果放到category上呢?通过category.post_count可以访问到:from django.db.models import Count
categories = Category.objects.annotate(posts_count=Count('post'))
print(categories[0].posts_count)
这相当于给category动态增加了属性post_count,而这个属性的值来源于Count('post'),最后可以用int取整。Sum
同Count类似,只是它是用来做合计的。比如想要统计所有数据字段的总和,可以这么做:from django.db.models import Sum
Post.objects.all().aggregate(a=Sum('字段'))
#输出类似结果:{'a':487}为字典
python中对字典中键值对的获取:for i in book:print(i)#键的获取print(book[i])#值的获取
上面演示了QuerySet的annotate和aggregate的用法,其中前者用来給QuerySet结果増加属性,后者只用来直接计算结果,这些聚合表达式都可以与它们结合使用。除了Count和Sum外,还有Avg、Min和Max等表达式,均用来满足我们对SQL査洵的需求。


- 语法
- 路径导向

- 蟒蛇—> google
- 双态 动态 静态 自动记忆管理(java 有 C没有)

- 符号处理 后端平行处理
- 语法形态
- 数值应用 运算
- 连续 分散
- 语法适合 特别学术需求

- 框架转换


- 空白键 缩排 跳行 有意义 (其他语言得 “ ;”{ }“)
- \ 转义字符


- 模组 变量
- 区分大小写




















前后端分离跨域方案
跨域请求存在诸多安全问题,例如CSRF攻击等,
浏览器针对这个安全问题会有一个同源策略,必须是我们上面说到的同源请求,才能顺利发出请求。
解决方案
1.JSONP,比较原始的方法,
本质上是利用html的一些不受同源策略影响的标签,
诸如:、、、
2.CORS,Cross-Origin Resource Sharing,是一个新的 W3C 标准,
它新增的一组HTTP首部字段,允许服务端其声明哪些源站有权限访问哪些资源。
换言之,它允许浏览器向声明了 CORS 的跨域服务器,发出 XMLHttpReuest 请求
,从而克服 Ajax 只能同源使用的限制。
在我们的django框架中就是利用CORS来解决跨域请求的问题。
Django中如何使用CORS
打开cmd,执行命令:pip install django-cors-headers

修改django项目中的setting.py,
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','corsheaders',#这是我们的主角,放在新建的其他项目之前'app01',]MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','corsheaders.middleware.CorsMiddleware', #注意顺序,必须放在这儿'django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',]
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
#允许所有的请求头
CORS_ALLOW_HEADERS = ('*')
pip freeze > requirements.txt
服务器 中 重新 安装 依赖
pip install -r requirements.txt

- 更新 settings 文件


centos django uwsgi 指定版本
系统版本


wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz

tar zxvf uwsgi-latest.tar.gz
编译:
python uwsgiconfig.py --build
这里的python 即指定uwsgi项目运行的python环境,在这之前,我做了软链接指向了我的python3.7环境

安装:
python3 setup.py install



然后进行软链接、系统便能够识别uwsgi命令
ln -s uwsgi目录 /usr/bin/uwsgi
ln -s /root/myProject/uwsgi/uwsgi-2.0.17.1/uwsgi /usr/bin/uwsgi
之后再用uwsgi去运行项目时、会自动调用上面编译的环境。

使用Django生成验证码 并发送qq邮箱
一、登录QQ邮箱–>设置–>账户–>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务


# 设置邮件域名 发送邮件服务器:smtp.qq.com
EMAIL_HOST = 'smtp.qq.com'
# 设置端口号,为数字 使用SSL,端口号465或587
EMAIL_PORT = 25
# 设置发件人邮箱
EMAIL_HOST_USER = 'xxxxxxx'
# 设置发件人授权码
EMAIL_HOST_PASSWORD = 'xxxxxxxx'
# 设置是否启用安全连接
EMAIL_USE_TLS = True
# redis连接
REDIS_CON = redis.StrictRedis(host='localhost', port=6379)
# 随机验证码
def vercode(user):res1 = ''for i in range(4):num = random.randint(0, 9)res1 += str(num)REDIS_CON.set(f'{user}', res1)REDIS_CON.expire(f'{user}', 10)return res1class Send_Email(View):def get(self, request):re_send = request.GET.get('email')sbj = '测试邮箱发送验证码'msg = f'您的验证码为:{vercode(re_send)}'from_send = EMAIL_HOST_USER# subject 标题 message 内容 from_email 发送人 recipient_list 接收人(多个)res = send_mail(subject=sbj, message=msg, from_email=from_send, recipient_list=[re_send])if res == 1:return render(request, 'send_email.html')else:return render(request, 'send_email.html')class register(View):def get(self, request):code = request.GET.get('code')email = request.GET.get('email')if email:scode = REDIS_CON.get(email)if scode:if code == scode.decode('utf-8'):print('验证成功')else:print('验证码不正确')else:print('验证码已失效')else:print('邮箱不正确')return HttpResponse('ok')
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>发送邮箱</title><script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>
邮箱:<input type="text" name="email" id="email_id">
<input type='submit' value="发送邮箱" onclick="send()">
</body>
<script>function send() {$.ajax({url:'http://127.0.0.1:8000/app01/send_email/',method:'get',data:{'email':document.getElementById('email_id').value}})}
</script>
</html>相关文章:
开发知识点-Django
Django 1 了解简介2 Django项目结构3 url 地址 和视图函数4 路由配置5 请求及响应6 GET请求和POST请求查询字符串 7 Django设计模式及模板层8 模板层-变量和标签9 模板层-过滤器和继承继承 重写 10 url反向解析11 静态文件12 Django 应用及分布式路由创建之后 注册 一下 13 模型…...
Linux系统笔记参考
Linux系统笔记 一、基本命令 1、简单的几个命令 ls:显示指定目录下的文件目录清单(list) cd:切换目录,改变当前的工作目录(change directory) cd ~ 或 cd 切换到用户主目录(用户家…...
AI:62-基于深度学习的人体CT影像肺癌的识别与分类
🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…...
数字孪生智慧工厂3D无代码编辑工具提供强大、简单功能
相比传统的2D/2.5D,3d可视化场景脱颖而出,成为更多行业的首选,然而传统的3D可视化场景制作需要花费大量的人力财力及周期来创建复杂的3D模型和场景,对很多企业及个人来说是个挑战,3D可视化场景编辑器通过简单的拖拉拽&…...
python 为什么这么受欢迎?python的优势到底在哪里?
常言道:“流水的语言,铁打的Python”,目前它可以说是已经"睥睨天下,傲视群雄"了。它天生丽质,易于读写,非常实用,从而赢得了广泛的群众基础,被誉为"宇宙最好的编程语言"&am…...
Flutter转换png图片为jpg图片
1.需求 在xxx产品需求中,需要将png图片转为jpg图片。 2.引用库 image: ^4.1.3 Dart图像库提供了以各种图像文件格式加载、保存和操作图像的功能。 该库可以与dart:io和dart:html一起用于命令行、Flutter和web应用程序。 注:4.0是该库先前版本的主要修订…...
c++ grpc 第一个用例
一、linux 包管理工具安装 sudo apt-get update sudo apt-get install -y build-essential autoconf libtool pkg-config cmake sudo apt-get install -y libgflags-dev libgtest-dev sudo apt-get install -y clang libc-dev# 安装 gRPC C 相关依赖 sudo apt-get install -y …...
pandas笔记:读写excel
1 读excel read_excel函数能够读取的格式包含:xls, xlsx, xlsm, xlsb, odf, ods 和 odt 文件扩展名。 支持读取单一sheet或几个sheet。 1.0 使用的数据 1.1 主要使用方法 pandas.read_excel(io, sheet_name0, header0, namesNone, index_colNone, usecolsNon…...
【ES分词】
分词 #测试分词器 POST /_analyze {"text": "小米手机和华为手机都是国产mobilephone", "analyzer": "english" }不管analyzer是改成:standard还是chinese都无法实现中文分词。 处理中文分词一般采用IK分词器 安装链接&…...
Git设置显示中文
git config --global i18n.comitencoding utf-8 git config --global i18n.logoutputencoding utf-8 export LESSCHARSETutf-8...
数实结合的复杂电磁环境构建解决方案
数实结合的复杂电磁环境构建解决方案 数实结合的复杂电磁环境构建 目前无线收发设备面临的电磁环境愈发恶劣。为了检验设备在复杂电磁环境下的实际工作性能,需进行各种应用条件下的测试和试验。外场测试难以提供各种应用环境,存在测试周期长、成本高、难…...
MySQL geometry 类型数据测试
MySQL的geometry类型的表的创建和测试: CREATE TABLE geom_test01( id INT NOT NULL PRIMARY KEY, info varchar(100), geom GEOMETRY ); desc geom_test01; insert into geom_test01 (id,info,geom) values (1, geom, geomfromtext(MULTIPOLYGON(((1 1…...
基于袋獾算法的无人机航迹规划-附代码
基于袋獾算法的无人机航迹规划 文章目录 基于袋獾算法的无人机航迹规划1.袋獾搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用袋獾算法来优化无人机航迹规划。 1.袋獾搜索算法 …...
2024上海智博会,上海国际智慧城市,物联网,大数据展会(世亚智博会)
中国国际智慧城市,物联网,大数据博览会(简称:世亚智博会)自2010年创办以来,至今已成功举办十多届。世亚智博会是中国较高、规模较大、影响力较广的展会;是被国际业界公认的不可错过的名展之一。随着世亚智博会的国际地位和影响不断…...
家庭教育质量提升成未来教育关注重点
随着教育改革的不断深化,家校合作模式也在实践中不断探索和丰富。 11 月 6 日,第六届长三角家校合作论坛于上海杨浦盛大开幕,此次论坛围绕“家校协同与人的学校领导”这一主题展开深度研讨。论坛旨在交流和分享相关经验及做法,以…...
python入门系列(1)—— 环境安装
前言 社区里面有好多同学想要入门python,可能源于以下原因: 易学性:Python 的语法简洁、清晰,容易理解和上手,使得初学者能够轻松入门编程。无论是编写基本的脚本还是进行更复杂的开发,Python 都提供了友…...
react组件通信
目录 前言: 父子组件通信 子父组件通信 兄弟组件通信 总结 前言: React是一种流行的JavaScript库,用于构建现代化的、高性能的Web应用程序。在React中,组件是代码的构建块。组件通信是React中一个非常重要的概念,…...
学习笔记|Pearson皮尔逊相关系数|Spearman斯皮尔曼相关系数|和Kendall肯德尔tau-b相关系数|分析流程|-SPSS中双变量相关性分析系数
目录 学习目的软件版本原始文档基础概念皮尔逊相关系数基本假设(适用条件):系数的范围及意义实例1. 读数据:2.正态性检验:3.异常值检验(体重):4.分析: 斯皮尔曼相关系数基…...
计算机服务器中了locked勒索病毒怎么办,勒索病毒解密,数据恢复
随着网络技术的不断成熟,网络中存在的病毒威胁也不断增多,近期,云天数据恢复中心陆续接到很多企业的求助,企业的计算机服务器数据库遭到了勒索病毒攻击,并且勒索病毒的攻击与加密形式也发生了许多变化。其中攻击次数较…...
本地生活餐饮视频怎么拍摄能有更多流量?如何批量生产呢?
本地生活近几年特别的火,所以到现在各类内容雷同性也比较高,视频缺少新的创意和玩法,像餐饮店的视频,大部分都是拍顾客进门、拍餐饮店座无虚席的实景……作为用户,其实早就已经看腻了。 今天推荐本地生活餐饮店商家拍…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
