django基础知识6
文章目录
内建用户系统
定义:
Django带有一个用户认证系统。它处理用户账号、组、权限以及基于cookie的用户会话。
用户可以直接使用Django自带的用户表
基本字段:
模型类位置 from django.contrib.auth.models import User
uername,password,email,first_name,last_name,is_superuser(是否是管理员账号),is_staff(是否可以访问admin管理界面),is_active,last_login,date_joined(用户创建的时间)
基本模型操作
-
创建用户:
1.创建普通用户create_user from django.contrib.auth.models import User user = User.objects.create_user(username='用户名',password='密码',...) 2.创建超级用户create_superuser from django.contrib.auth.models import User user = User.objects.create_superuser(username='用户名',password='密码',...)
-
删除用户:
user = User.objects.get(username='用户名') user.is_active = False user.save()
-
校验密码:
from django.contrib.auth import authenticate user = authenticate(username=username,password=password) 如果用户名密码校验成功则返回对应的user对象,否则返回None
-
修改密码:
from django.contrib.auth.models import User try: user = User.objects.get(username= 'xiaonao') user.set_password('654321') user.save() return HttpResponse("修改密码成功! ") except: return HttpResponse("修改密码失败! ")
-
登录状态保存:(伪代码)
from django.contrib.auth import login def login_view(request): user = authenticate(username=username,password=password) login(request, user)
-
登录状态校验:
from django.contrib.auth.decorators import login_required @login_required def index_view(request): #该视图必须为用户登录状态下才可访问 #当前登陆用户可通过request.user获取 login_user = request.user ...
-
登录状态取消:
from django.contrib.auth import logout def logout_view(request): logout(request)
内建用户表-扩展字段
-
方案一:通过建立新表,跟内建表做1对1
-
方案二:继承内建的抽象user模型类
-
步骤:
1.添加新的应用 2.定义模型类继承AbstractUser 3.settings.py中指明AUTH_USER_MODEL='应用名.类名'
**注意:**此操作要在第一次Migrate之前进行
-
示例:
1.user/models.py -添加user应用 from django.db import models from django.contrib.auth.models import AbstractUser # create your models here. class userInfo(Abstractuser): phone = models.charField(max_length=11,default='') 2.settings.py添加配置 AUTH_USER_MODEL = 'user.Userlnfo' 3.添加用户 from user.models import Userlnfo Userlnfo.objects.create_user(username='xxx',password='...', phone='...')
-
文件上传
定义:
用户可以通过浏览器将图片等文件传至网站
场景:
-
用户上传头像
-
上传流程性的文档[pdf, txt等]
上传规范
-
前端[HTML]
-
文件上传必须为POST提交方式
-
表单
<form>
中文件上传时必须有带有enctype="multipart/form-data”
时才会包含文件内容数据。<form action="/test_upload" method="post" enctype="multipart/form-data">
-
表单中用
<input type="file" name="xxx">
标签上传文件
-
-
后端[Django]
-
视图函数中,用request.FILES取文件框的内容:
file=request.FILES['xxx']
说明:
- FILES的key对应页面中file框的name值
- file 绑定文件流对象
- file.name 文件名
- file.file 文件的字节流数据
-
配置文件的访问路径和存储路径
在setting.py中设置MEDIA相关配置;Django把用户上传的文件,统称为media资源 MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR,'media')
-
MEDIA_URL和MEDIA_ROOT需要手动绑定
- 步骤:主路电中添加路由
from django.conf import settings from django.conf.urls.static import static urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
- 说明:等价于做了MEDIA_URL开头的路由,Django接到该特征请求后去MEDIA_ROOT路径查找资源
-
文件写入方案
-
方案一:传统的open方式
@csrf_exempt def up1oad_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 +"成功")
-
方案二:借助ORM
创建模型类 字段:FileField(upload='子目录名') @csrf_exempt def up1oad_view_dj (request): if request.method == 'GET': return render(request,'test_upload.htm1') elif request.method == 'POST': title = request.POST['title'] myfile = request.FILES['myfile'] content.objects.create(desc=title,picture=myfile) return HttpResponse( '----upload is ok----- ')
-
-
django发送邮件
业务场景:
业务告警、邮件认证、密码找回
邮件相关协议
-
SMTP
- SMTP的全称是"Simple Mail Transfer Protocol",即简单邮件传输协议(25号端口)。
- 它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转
- 属于“推送”协议
-
IMAP
- IMAP全称是lnternet Mail Access Protocol,即交互式邮件访问协议,是一个应用层协议(端口是143)。
- 用来从本地邮件客户端(Outlook Express、Foxmail、MozillaThunderbird等)访问远程服务器上的邮件。
- 属于“拉取”协议
-
POP3
- POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,是TCP/IP协议族中的一员(默认端口是110)。
- 本协议主要用于支持使用客户端远程管理在服务器上的电子邮件·属于“拉取”协议
**对比:**IMAP vs POP3
- 两者均为“拉取"型协议,负责从邮件服务器中下载邮件
- IMAP具备摘要浏览功能,可预览部分摘要,再下载整个邮件
- IMAP为双向协议,客户端操作可反馈给服务器
- POP3必须下载全部邮件,无摘要功能
- POP3为单向协议,客户端操作无法同步服务器
Django发邮件
Django中配置邮件功能,主要为SMTP协议,负责发邮件
-
原理:
- 给Django授权一个邮箱
- Django用该邮箱给对应收件人发送邮件
- django.core.mail封装了电子邮件的自动发送SMTP协议
-
步骤:
1. 授权 - 以qq邮箱为例 (1) 申请QQ号 (2) 用QQ号登陆QQ邮箱并修改设置 -用申请到的QQ号和密码登陆到 https://mail.qq.com/ -修改`QQ邮箱->设置->帐户->“POP3/IMAP...服务" -->授权码:spvqtopkwxhvecfa 2. Django配置 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend" EMAIL_HOST = 'smtp.qq.com'#腾讯QQ邮箱SMTP服务器地址 EMAIL_PORT = 25 # SMTP服务的端口号 EMAIL_HOST_USER = ‘xxxx@qq.com’#发送邮件的QQ邮箱 EMAIL_HOST_PASSWORD = ‘******’ #在QQ邮箱->设置->帐户->"POP3/IMAP...服务”里得到的在第三方登录QQ邮箱授权码 #EMAIL_USE_TLS = False #与SMTP服务器通信时,是否启动TLS链接(安全链接)默认False 3. 函数调用: from django.core import mail mail.send_mai1( subject, #题目 message, #消息内容 from_emai1, # 发送者[当前配置邮箱] recipient_list=['xxx@qq.com'], #接收者邮件列表 ) 例:mail.send_mail(subject='测试邮件', message='hhhhh', from_email='xxx@qq.com', recipient_list=['xxx@qq.com'])
项目部署-uwsgi
基础概念:
项目部署是指在软件开发完毕后,将开发机器上运行的软件实际安装到服务器上进行长期运行
1. 在安装机器上安装和配置同版本的环境[py,数据库等]
2. django项目迁移
sudo scp /home/tarena/django / mysite1 root@88.77.66.55 : / home /root/xxx
请输入root密码:
3.用uWSGI替代python3 manage.py runserver方法启动服务器
4.配置nginx反向代理服务器
5.用nginx配置静态文件路径,解决静态路径问题
uWSGI网关接口配置:
-
(WSGI定义):
- WSGl(Web Server Gateway Interface)Web服务器网关接口,是Python应用程序或框架和Web服务器之间的一种接口,被广泛使用
- 使用python manage.py runserver通常只在开发和测试环境中使用
- 当开发结束后,完善的项目代码需要在一个高效稳定的环境中运行,这时可以使用WSGl
-
uWSGI定义:
- uwSGI是WSGI的一种,它实现了http协议wSGI协议以及uwsgi协议uWSGI功能完善,支持协议众多,在python web圈热度极高
- uWSGI主要以学习配置为主
-
uWSGI安装:
Ubuntu执行sudo pip3 install uwsgi==2.0.18 -i https://pypi.tuna.tsinghua.edu.cn/simple/ 检查是否安装成功 sudo pip3 freezelgrep -i 'uwsgi' -->如果成功安装,则会输出uwSGl==2.0.18
-
配置uWSGI
添加配置文件项目同名文件夹/uwsgi.ini: 如: mysite1/mysite1/uwsgi.ini 文件以[uwsgi]开头,有如下配置项: 套接字方式的IP地址:端口号【此模式需要有nginx】 socket=127.0.0.1:8000 Http通信方式的IP地址:端口号 http=127.0.0.1:8000 项目当前工作目录: (绝对路径) chdir=/home/tarena/../my_project 项目中wsgi.py文件的目录,相对于当前工作目录: wsgi-file=my_project/wsgi.py 进程个数: process=4 每个进程的线程个数: threads=2 服务的pid记录文件: pidfile=uwsgi.pid 服务的目志文件位置: daemonize=uwsgi.log #后台启动,日志输出在uwsgi.log中 开启主进程管理模式: master=true 特殊说明: Django 的settings.py需要做如下配置 1.修改settings.py将 DEBUG=True改为DEBUG=False 2.修改settings.py将 ALLOWED_HOSTS =改为ALLOWED_HOSTS =['网站域名']或者[服务监听的ip地址"]
-
uWSGI的运行管理:
启动uwsgi cd到uWSGI配置文件所在目录 uwsgi --ini uwsgi.ini 停止uwsgi cd到uwSGI配置文件所在目录 uwsgi --stop uwsgi.pid 说明: 1.无论是启动还是关闭,都需要执行ps aux|grep 'uwsgi'确认是否符合预期 2.启动成功后,进程在后台执行,所有日志均输出在配置文件所在目录的uwsgi.log中 3.Django中代码有任何修改,需要重新启动uwsgi
-
uWSGI测试
在浏览器端输入http://127.0.0.1:8000/url进行测试 注意:此时端口8000被uWSGl进程监听,并非runserver如果当前有预期返回,则uwSGI启动成功
uWSGI常见问题汇总:
- 启动失败: 端口被占用
- 原因: 有其他进程占用uwSGI启动的端口;
- 解决方案: 可执行sudo lsof -i:端口号查询出具体进程;杀掉进城后,重新启动uWSGI即可
- 停止失败: stop无法关闭uWSGI
- 原因: 重复启动uWSGl,导致pid文件中的进程号失准
- 解决方案: ps出uWSGI进程,手动kill掉
项目部署-nginx
基本概念:
-
Nginx是轻量级的高性能Web服务器,提供了诸如HTTP代理和反向代理、负载均衡等一系列重要特性
-
C语言编写,执行效率高
-
nginx作用:
- 负载均衡,多台服务器轮流处理请求
- 反向代理: 浏览器 --HTTP–> nginx --uwsgi/HTTP–> uWSGI
-
原理:
- 客户端请求nginx,再由nginx将请求转发uwSGI运行的django
-
安装:
sudo apt install nginx 如果下载速度很慢,考虑更换为国内源 vim /etc/apt/sources. 1ist 更改国内源 sudo apt-get update 安装完毕后, ubuntu终端中输入nginx -v显示如下: nginx version: nginx/1.14.0 (Ubuntu)
-
配置:
修改nginx的配置文件/etc/nginx/sites-enabled/default;sudo vim该文件 #在server节点下添加新的1ocation项,指向uwsgi的ip与端口。 server { ... location / { uwsgi_pass 127.0.0.1:8000;#重定向到127.0.0.1的8000端口 include /etc/nginx/uwsgi_params ; #将所有的参数转到uwsgi下 } ... }