零基础入门学django框架,超详细基础知识(六)

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发送邮件

业务场景:

业务告警、邮件认证、密码找回

邮件相关协议
image-20210709211020116
  • 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定义):

    image-20210709211055729
    • WSGl(Web Server Gateway Interface)Web服务器网关接口,是Python应用程序或框架和Web服务器之间的一种接口,被广泛使用
    • 使用python manage.py runserver通常只在开发和测试环境中使用
    • 当开发结束后,完善的项目代码需要在一个高效稳定的环境中运行,这时可以使用WSGl
  • uWSGI定义:

    image-20210709211115300
    • 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下
    		}
    		...
    	}
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值