【Django】内建用户、文件上传、发送邮件、项目部署

news/2024/3/29 19:04:34/文章来源:https://blog.csdn.net/weixin_44840038/article/details/129122922

一、内建用户系统

Django带有一个用户认证系统用来处理账号、cookie等

from django.contrib.auth.models import User

在这里插入图片描述
在这里插入图片描述

1、创建用户

from django.contrib.auth.models import User
# 普通用户
user = User.objects.create_uer(username='用户名',password='密码',email='邮箱')
# 超级用户
user = User.objects.create_superuer(username='用户名',password='密码',email='邮箱')

会存储在mysql的auth_user中

2、删除用户

from django.contrib.auth.models import User
try:user = User.objects.get(username='用户名')user.is_active = False #伪删除user.save()
except:...删除失败

3、校验密码

from django.contrib.auth import authenticate
user = authenticate(username = username,password =password)
# 成功返回user对象,失败返回None

4、修改密码

from django.contrib.auth.models import User
try:user = User.objects.get(username='用户名')user.set_password('新密码')user.save()
except:...修改失败

5、登录状态保持

只能校验session 不能存cookie

from django.contrib.auth import login
def login_view(request):user = authenticate(username = username,password =password)login(request,user)

6、登录状态校验

不用再自己写装饰器,可直接调用内置的

from django.contrib.auth.decorators import login_required@login_required
def index_view(request):# 当前登录用户可通过request.user获取login_user = request.user

7、登录状态取消

from django.contrib.auth import logout
def logout_view(request):logout(request)

8、扩展字段

方案1:通过建立新表,跟内建表做1对1(创建简单,使用麻烦)
方案2:继承内建的抽象user模型类(创建麻烦,使用简单)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、文件上传

1、前端

  1. 文件上传必须为POST提交方式
  2. 表单form中必须带有 enctype='multipart/form-data时才会包含文件内容数据。
  3. <input type= 'file' name='xxx'>标签上传文件
    <form action="/test_upload/" method="POST" enctype="multipart/form-data"><p><input type="text" name="title"></p><p><input type="file" name="myfile"></p><p><input type="submit" value="上传"></p></form>

2、配置

1、在settings.py中设置MEDIA相关配置:

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

2、创建media文件夹
3、手动绑定

# 在主路由中添加路由
from django.conf import settings
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)

3、后端

  1. FILES的key对应页面中file框的name值
  2. file = request.FILES[‘xxx’] 绑定文件对象
  3. file.name 可得到文件名
  4. file.file 可得到文件的字节流数据

4、文件写入

(1)open写入

@csrf_exempt
def upload_view(request):if request.method=='GET':return render(request,'test_upload.html')elif request.method == 'POST':a_file = request.FILES['myfile']print('上传的中文名是',a_file.name)# 拼接绝对路径filename = os.path.join(settings.MEDIA_ROOT,a_file.name)with open(filename,'wb') as f:data = a_file.file.read()f.write(data)return HttpResponse('接收文件'+a_file.name+'成功')

会有文件重名现象

(2)借助ORM

字段:FileField(upload=‘子目录名’)
作用:将文件的路径存入数据库中,方便与后续功能进行绑定(用户与头像等)

class Content(models.Model):title = models.CharField('文章名字',max_length=11)picture = models.FileField(upload_to='picture')
from upload_app.models import Content
@csrf_exempt
def test_upload(request):if request.method == 'GET':return render(request,'test_upload.html')elif request.method == 'POST':title = request.POST['title']a_file = request.FILES['myfile']Content.objects.create(title=title,picture=a_file)return HttpResponse('接收文件'+a_file.name+'成功')

三、发送邮件

业务场景:业务告警、邮件验证、密码找回

1、邮箱协议

  1. SMTP协议:简单邮件传输协议,从源地址到目的地址传输邮件的规范,用来控制邮件的中转,属于推送协议。
  2. IMAP协议:交互式邮件访问协议,用来从本地邮件客户端访问远程服务器上的邮件,属于拉取协议。可先浏览部分摘要,再卸载整个邮件。属于双向协议,客户端的操作可反馈给服务器。
  3. POP3协议:邮局协议,用于支持使用客户端远程管理在服务器上的电子邮件,属于拉取协议。必须下载全部邮件。是单项协议,客户端操作无法同步给服务器。
    在这里插入图片描述

2、Django中的邮箱

  1. Django充当邮件客户端的角色,主要为SMTP协议,负责发送邮件。
  2. 给Django授权一个邮箱,用该邮箱给对应收件人发送邮件
  3. django.core.mail封装了电子邮件的自动发送SMTP协议。

授权步骤:
1、修改邮箱的POP3/IMAP服务
2、Django配置

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com' # 腾讯邮箱SMTP服务器地址
EMAIL_PORT = 25 # SMTP服务器的端口号
EMAIL_HOST_USER = 'xxxx@qq.com'
EMAIL_HOST_PASSWORD = 'XXXXXXXXX' # 第三方登录的授权码
EMAIL_USE_TLS = False # 与SMTP服务器通信时是否启用TLS链接(安全链接) 默认False 

3、函数调用

from django.core import mail
mail.send_mail(subject, # 题目message, # 消息内容from_email, # 发送者recipient_list = ['xxx@qq.com'], # 接收者邮件列表
)

3、练习 - 邮件告警

用中间件实现抓取视图函数中的异常,并以邮件的形式将异常信息发送给指定联系人。要求收件人可以灵活配置。

from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin
from django.conf import settings
from django.core import mail
import tracebackclass MAILWarningMW(MiddlewareMixin):def process_exception(self, request, exception):# 显示报错的整体情况traceback.format_exc()mail.send_mail(subject='mysite1异常告警',message=traceback.format_exc(),from_email='1065621633@qq.com',recipient_list = settings.RECIPIENT_EMAIL)# settings.RECIPIENT_EMAIL是自定义配置的收件人邮箱return HttpResponse('当前网页有点忙')

四、项目部署

在开发完毕后,将开发机器上运行的软件实际安装到服务器上长期运行。
1、在安装机器上安装和配置同版本的环境
2、django项目迁移

sudo scp ...../django/mysite1 root@88.77.66.55:......./xxx

3、用uWSGI替代python3 manage.py runserver 方法启动服务器
4、配置nginx反向代理服务器
5、用nginx配置静态文件路径,解决静态路径问题

1、uWSGI网关接口配置

WSGI是python应用程序或框架和Web服务器之间的一种接口,他不能读http和https协议。
在这里插入图片描述

uWSGI是WSGI的一种,可以实现http协议、WSGI协议、uwsgi协议等。
在这里插入图片描述

  1. 安装:sudo pip3 install uwsgi==2.0.18 -i https://pypi.tuna.tsinghua.edu.cn/simple/
  2. 添加配置文件:项目同名文件夹/uwsgi配置名.ini 如:mysite1/mysite1/project1.ini
[uwsgi] # 必须以此开头
socket=127.0.0.1:8000 # 套接字方式的IP地址:端口号,此模式需要有nginx
http=127.0.0.1:8000 # Http通信方式的IP地址:端口号
# 项目当前工作目录 是绝对路径
chdir = /home/tarena/.../my_project
# 项目中wsgi.py文件的目录,即当前工作目录 是相对路径
wsgi-file = my_project/wsgi.py
# 进程个数
process = 4
# 每个进程的线程个数
threads = 2
# 服务的pid记录文件
pidfile = uwsgi.pid
# 服务的日志文件位置
daemonize = uwsgi.log
# 开启主进程管理模式
master = True
  1. settings中需修改的配置
DEBUG= True 改为 False
ALLOWED_HOSTS= [] 改为 ['网站域名']或者['服务监听的ip地址']
  1. uWSGI的运行管理
    启动uwsgi:cd到uWSGI配置文件 所在目录 uwsgi --ini uwsgi.ini
    停止uwsgi:cd到uWSGI配置文件所在目录 uwsgi --stop uwsgi.pid
  2. 运行说明
    无论启动还是关闭,都需要执行ps aux|grep 'uwsgi' 确认是否符合预期。
    启动成功后,所有日志均输出在uwsgi.log中。
    Django中代码有任何修改,需要重新启动uwsgi。
  3. uWSGI测试

在这里插入图片描述

2、Nginx

是轻量级的高性能Web服务器,提供了诸如HTTP代理和反向代理负载均衡(多台服务器轮流处理请求)等一系列重要特性。原理是客户端请求nginx,再由nginx将请求转发uWSGI运行的django。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时服务器的端口改为了80,而不再是8000。

在这里插入图片描述
在这里插入图片描述

3、nginx静态文件配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、nginx的其他功能

404/500页面
在这里插入图片描述
邮箱告警
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【ROS学习笔记1】ROS快速体验输出Hello World

【ROS学习笔记1】ROS快速体验输出Hello World 文章目录【ROS学习笔记1】ROS快速体验输出Hello World1.1 ROS快速体验1.1.1 Hello World快速实现简介1.1.2 Hello World的C实现1.1.3 Hello World的Python实现写在前面&#xff0c;本系列笔记参考的是AutoLabor的教程&#xff0c;具…

51单片机入门 - 驱动多位数码管

我使用的是普中51单片机开发板A2套件&#xff08;2022&#xff09;&#xff0c;驱动数码管可能需要参考电路原理图。开发环境的搭建教程在本专栏的 51单片机开发环境搭建 - VS Code 从编写到烧录 有过介绍。 关于我的软硬件环境信息&#xff1a; Windows 10STC89C52RCSDCC &am…

【免费教程】地下水环境监测技术规范HJ/T164-2020解读使用教程

地下水环境监测技术规范依据《中华人民共和国环境保护法》第十一条“国务院环境保护行政主管部门建立监测制度、制订监测规范”和《中华人民共和国水污染防治法》的要求&#xff0c;积极开展地下水环境监测&#xff0c;掌握地下水环境质量&#xff0c;保护地下水水质&#xff0…

筑基七层 —— 数据在内存中的存储?拿来吧你

目录 零&#xff1a;移步 一.修炼必备 二.问题思考 三.整型在内存中的存储 三.大端字节序和小端字节序 四.浮点数在内存中的存储 零&#xff1a;移步 CSDN由于我的排版不怎么好看&#xff0c;我的有道云笔记相当的美观&#xff0c;请移步至有道云笔记 一.修炼必备 1.入门…

驱动程序开发:基于ICM20608六轴传感器 --- 使用Regmap API 的 SPI 读取数据 之 IIO驱动

目录一、IIO 子系统简介二、IIO子系统使用的一些相关的结构体、函数等1、iio_dev 结构体  ①modes&#xff1a;是选择iio驱动设备支持的工作模式&#xff0c;模式分别有如下&#xff1a;  ②dev&#xff1a;其是一个设备结构体。  ②channels&#xff1a;为 IIO 设备通道…

[机器学习]XGBoost---增量学习多阶段任务学习

一 说明当我们的训练数据非常多&#xff0c;并且还在不断增加时&#xff0c;每次都用全量训练&#xff0c;数据过多&#xff0c;时间过长&#xff0c;此时就可以使用增量训练&#xff1a;用新增的数据微调校正模型。二 全量与增量的差异在使用增量训练时&#xff0c;最关心的问…

Head First设计模式---5.单例模式

2.2单例模式 单例模式运用的可能比其他几种简单&#xff0c;通俗点理解就是&#xff0c;我这个对象只能存在一个。 问题 保证一个类只有一个实例。 为什么会有人想要控制一个类所拥有的实例数量&#xff1f; 最常见的原因是控制某些共享资源 &#xff08;例如数据库或文件&am…

【Java】Spring更简单的读取和存储

文章目录Spring更简单的读取和存储对象1. 存储Bean对象1.1 前置工作&#xff1a;配置扫描路径1.2 添加注解存储Bean对象1.2.1 Controller(控制器存储)1.2.2 Service(服务存储)1.2.3 Repository(仓库存储)1.2.4 Component(组件存储)1.2.5 Configuration1.3 为什么要这么多类注解…

结构建模设计——Solidworks软件之装配体操作基本总结三(高级配合、机械配合、快捷菜单功能)

【系列专栏】&#xff1a;博主结合工作实践输出的&#xff0c;解决实际问题的专栏&#xff0c;朋友们看过来&#xff01; 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》 《Android开发实战》 《实用硬件方案设计》 长期持续带来更多案例与技术文章分享…

如何设计一个通用的权限管理系统

一个系统&#xff0c;如果没有安全控制&#xff0c;是十分危险的&#xff0c;一般安全控制包括身份认证和权限管理。用户访问时&#xff0c;首先需要查看此用户是否是合法用户&#xff0c;然后检查此用户可以对那些资源进行何种操作&#xff0c;最终做到安全访问。身份认证的方…

K8s调度器Scheduler

当创建k8s pod的时候调度器会决定pod在哪个node上被创建且运行&#xff0c;调度器给apiserver发出了一个创建pod的api请求&#xff0c;apiserver首先将pod的基本信息保存在etcd&#xff0c;apiserver又会把这些信息给到每个node上的kubelet进程&#xff0c;kubelet一直在监听这…

【python】anaconda 管理 python 环境

anaconda 管理虚拟环境anaconda 简介python 虚拟环境的安装查看当前 anaconda中所有的虚拟环境创建新的虚拟环境激活所创建的虚拟环境删除指定的虚拟环境退出当前虚拟环境查看当前虚拟环境中所有安装的库安装常用包pycharmpycharm 下环境配置pycharm 使用anaconda 简介 anacon…

springBoot使用ShardingJDBC实现分表

ShardingSphere的介绍 ShardingSphere是一款起源于当当网内部的应用框架。2015年在当当网内部诞 生&#xff0c;最初就叫ShardingJDBC。2016年的时候&#xff0c;由其中一个主要的开发人员张亮&#xff0c; 带入到京东数科&#xff0c;组件团队继续开发。在国内历经了当当网、…

LeetCode 622.设计循环队列

设计你的循环队列实现。 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里&a…

注意啦!如何通过广告吸引客户直接下单?

2023年跨境电商越来越突出&#xff0c;据业内相关人士称&#xff0c;在未来几年与跨境电商相关的政策仍会继续倾斜甚至加大力度&#xff0c;因此各行各业都响应政策&#xff0c;在新政策落实之前致力于平台的转型升级&#xff0c;做新时代创新型的高质量发展&#xff0c;其实细…

Linux下的命令执行绕过技巧合集(渗透测试专用)

一、通配符* 代表『0个到无穷多个』任意字符&#xff0c;包括空字符? 代表『一定有一个』任意字符[ ] 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符&#xff0c; 可能是 a, b, c, d 这四个任何一个』[ - ]若有减号在中括号内时&#…

(考研湖科大教书匠计算机网络)第六章应用层-第五节:文件传送协议FTP

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;概述二&#xff1a;工作原理三&#xff1a;控制连接与数据连接本节对应视频如下 【计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;】…

求职3个月,简历大多都石沉大海,一听是手工测试都纷纷摇头....太难了

距离被上家公司裁员已经过去了3个月了&#xff0c;3个月的求职经历真的让我痛不欲生&#xff0c;我也从中理解感叹到了很多&#xff0c;想写出来&#xff0c;告诫跟我一样的经历的人。 我今年26岁&#xff0c;大学是一所普通的大专&#xff0c;学的是机电专业&#xff0c;如何…

Python自动化测试框架封装和调用

封装与调用函数与参数化前言 面实现了参数的关联&#xff0c;那种只是记流水账的完成功能&#xff0c;不便于维护&#xff0c;也没什么可读性&#xff0c;接下来这篇可以把每一个动作写成一个函数&#xff0c;这样更方便了。参数化的思维只需记住一点&#xff1a;不要写死 登录…

类与对象(this 关键字、构造器)

目录一、面向对象二、类与对象三、对象内存图四、成员变量和局部变量区别五、this关键字六、构造器/构造方法一、面向对象 一种编程思想:也就是说我们要以何种思路&#xff0c;解决问题&#xff0c;以何种形式组织代码 当解决一个问题的时候&#xff0c;面向对象会把事物抽象成…