Djnago
django 模型
-
模型字段
-
boole = models.BooleanField(‘bool 值’, 1)
-
varchar = models.CharField(‘char 字段’, max_length=10)
-
date = models.DateField(‘时间’, default=‘2022-11-1’)
-
DateField 有三个参数,可用选择其中一个参数进行配置。
-
auto_now:每次保存对象时,自动设置为该字段的当前时间(取值:true/false)
-
auto_now_add:当对象被第一次创建时自动设置为当前时间值
-
default:设置当前时间(取值:字符串格式时间,如:‘2016-10-10’)
-
-
-
date2 = models.DateTimeField(‘更为精确的时间’, auto_now=())
- DateTimeField 的参数与 DateFiled 相同,也是前面的三个
-
float = models.FloatField(‘float’)
-
decimal = models.DecimalField(“小数”, max_digits=5, decimal_places=2)
-
decimal 的参数有
-
max_digits:位数总位数,包括小数点后面的位数
-
decimal_places:小数点后的数字数量
-
-
-
email = models.EmailField(‘邮件’)
- email 是 django 利用正则表达式限制 varchar 实现的,邮箱类字段。
-
Int = models.IntegerField(‘整数’)
-
img = models.ImageField(‘图片路径’)
- img 是 django 用来存储图片路径的字段
-
text = models.TextField(‘不定长字符串’)
- 字段选项
- primary——key:设置为 true,表示该字段被设置为主键。如果指定字段为主键后,django 不会自动创建 id 字段。
- blank:设置为 true 时,字段可以为空。设置为 false,字段必须填写。
- null:如果设置为 true,表示该列,可以为空,默认为 false,(如果设置了 null=false,建议为该列设置 default 值)
- default:设置该列的默认值。
- db_index:如果设置为 true,表示为该列增加索引。
- unique:如果设置为 true,表示该列的值必须唯一,不能重复
- db_column:指定列的名词,如果不指定的化,采用属性名作为列明。
- verbose_name:设置此字段在 admin 界面上的显示名称。
Django 映射
-
一对一关系:
- 创建一对一关系:OneToOneFiled(类名,on_delete=xxx)
- on_delete(级联删除):
- models.CASCADE 级联删除,(ON DELETE CASCADE)删除外键的对象
- models.PROTECT 抛出 ProtectedError 阻止被引用对象的删除(RESYTRICT)
- SET_NULL 设置 ForeignKey null;需要指定 null=True
- SET_DEFAULT 将外键 ForeignKEy 设置为默认值;必须设置 ForeignKey 的默认值.
- on_delete(级联删除):
- 创建一对一关系:OneToOneFiled(类名,on_delete=xxx)
Cookies And Session
COOKIE :
HttpRespond 调用:
- set_cookie(key,value=‘’,max_age=None,expires=None)–>添加或修改 cookie
- key:cookie 的名字
- value:cookie 的值
- max_age:cookie 存活时间,秒为单位
- expires:具体过期时间
- 当不指定 max_age 和 expires 时,关闭浏览器时,cookie 自动失效
- delete_cookie(key)—>删除 cookie
- key:cookie 的名字
request 调用:
- request.COOKIES :查询 COOKIES 数据
- 例:value=request.COOKIES.get(‘cookies 名’,‘默认值’)
SESSION :
- 保存 cookie 的值到服务器:
- request.session[‘key’]=value
- 获取 session 的值:
- value=request.session[‘key’]
- value=request.session.get(‘key’,默认值)
- 删除 session 的值:
- del request.session[‘key’]
- 命令行,清除过期的 sessionid:
- python manage.py clearsessions
- setting.py 设置:
- 指定 session 在 cookies 中的保存时长(默认为两周)
- SESSION_COOKIE_AGE=60*60*24*7*2
- 设置浏览器关闭时,将 session 取消.(m 默认为 Fasle)
- SESSION_EXPIRE_AT_BROWSER_CLOSE=True
- 保证前两个设置有效必须设置以下选项为 true:
- SESSION_SAVE_EVERY_REQUEST = True
- 指定 session 在 cookies 中的保存时长(默认为两周)
Djnago Cache
-
一 :相关概念与配置
缓存常用在网页 “数据变动较小且常常需要访问” 的地方.
将数据加入缓存,可以换取更快的网页访问服务.缓存数据的存储地点在数据库表内.
- 配置 django 缓存表. 1.
CACHES ={ 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 'LOCATION': 'cache_table', 'TIMEOUT': 300, # 缓存保存时间 单位秒, 默认值 300 'OPTIONS': { 'MAX-ENTRIES': 300, #缓存最大数据条数 'CULL_FREQUENCY': 2, #缓存条数达到最大值时, 删除 1/x 的缓存数据 } } }
- 配置 django 缓存表. 1.
-
二 :整体缓存策略(作用于整个视图函数)
- 在视图函数 使用整体缓存
- 导入装饰器:from django.views.decorators.cache import cache_page
- 在需要进行缓存的视图函数上添加装饰器:@cache_page(s),–>s 为视图缓存的存储时间,单位秒
- 在路由 使用整体缓存
- 导入装饰器:from django.views.decorators.cache import cache_page
- 在路由中,引入视图函数的位置前,导入装饰品: path(“path/” , cache_page(s) (view.fun))
- 在视图函数 使用整体缓存
-
二 :局部缓存策略(作用于视图函数内的变量)
- 使用 caches 对象
- 导入对象: from django.core.cache import caches
- cache1=caches[‘setting.py 内 CACHES 字典中的键’]
- 直接使用 CACHES 的’default’对象
- 导入包:from django.core.cache import cache
- 设置存储方法:cache.set(key,value,timeout)
- key:缓存的 key,字符串类型
- value:python 对象
- timeout:缓存的存储时间,默认为 CACHES 中的 TIMEOUT 值
- 获取缓存方法:cache.get(key)
- key:缓存的 key
- 返回 key 的具体值,如果没有数据,返回 None
- 存储缓存,只在 key 不存在时生效:cache.add(key,value)
- 返回值 true 或者 false
- 使用 caches 对象
Djnago 中间件
-
一 :相关概念与配置
-
中间件类必须继承 django.utils.deprecation.MiddlewareMixin 类
-
中间件类必须实现下列五个方法中的一个或者多个:
- 执行路由前被调用,在每个请求上调用,返回 None 或者 HttpResponse 对象
- process_request(self,request):
- 执行视图前被调用,在每个请求上调用,返回 None 或者 HttpResponse 对象
- process_view(self,request,callback,callback_args,callback_kwargs)
- 所有响应返回浏览器 被调用,在每个请求上调用,必须返回 sponse 对象
- process_response(self,request,response)
- 当处理过程中抛出异常被调用,返回一个 HttpResponse 对象
- process_exception(self,request,exception)
- 在视图函数执行完毕且视图返回对象中包含 render 方法时被调用;该方法需要返回实现了 render 方法的响应对象
- process_template_response(self,request,response)
- 执行路由前被调用,在每个请求上调用,返回 None 或者 HttpResponse 对象
-
配置中间件,settings.py 中设置
MINDDLEWARE=[ ,]
-
Djnago 分页
-
一 :相关概念与配置
- 导入包:from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
- 分页对象的构造方法:paginator=Paginator(object_list,per_page)
- onject_list 需要分页的数据对象列表哦
- per_page 每页数据个数
- 返回值 paginator 对象
- paginator 对象 的属性
- count: 需要分页数据的对象总数
- num_pages:分页后的页面总数
- page_range:从 1 开始的 range 对象,用于记录当前页码数
- per_rang:每页数据的个数
- paginator 对象 的方法
- page(number):返回指定页的对应页信息,如果页码不存在会抛出 invalidPage 异常, page 方法返回 page 对象
- page 对象方法
- has_next():如果有下一页返回 true
- has_previous():如果有上一页返回 true
- has_other_pages():如果有上一页或者下一页返回 true
- next_page_number():返回下一页的页码,如果不存在抛出 invalidPage 异常
- previous_page_number():返回上一页的页码,如果不存在抛出 invalidPage 异常
- page 对象属性:
- object_list:当前页上所有数据对象的列表
- number:当前页的序号,从 1 开始
- paginator:当前 page 对象相关的 Paginator 对象
Djnago csv 文件
生成 csv 文件
-
相关概念:
- csv(Comma-Separated Values):逗号分隔值文件,用于存储表格数据.
-
使用步骤案例:
import csv
"""
@param: CSVDemo1.csv 创建的csv文件名.
@param: w 以write(可写)方式进行IO流操作
@param: newline="" 方法默认参数,必须存在
"""
# with关键字封装了try catch操作:减少了步骤
with open('CSVDemo1.csv', "w", newline="") as csvfile:
# 创建writer对象.
writer = csv.writer(csvfile)
# 通过writer对象写入行
writer.writerow(['a', 'b', 'c'])
writer.writerow(['d', 'e'])
writer.writerow(['f'])
下载 csv 文件
- 请求体的 Content-Type 类型需修改为 text/csv
- 请求头里加入 Content-Disposition=attachment;filename=‘mybook.csv’ 属性.
- 创建 writer 对象,并将数据写入到 response 里面
- writer 对象调用 writerow 方法写入数据行.
- 返回 response 对象
def make_csv_view(request):
response = HttpResponse(content_type="text/csv")
response['Content-Disposition'] = 'attachment;filename="mybook.csv"'
all_book = Book.objects.all()
writer = csv.writer(response)
writer.writerow(['书名', '作者'])
for i in all_book:
writer.writerow([i.title, i.info])
# 直接返回response.
print(response)
return response
Djnago 内建用户表
利用内建用户表创建用户
- 创建普通用户
- from django.contrib,auth.models import User
- user=User.objects.create_user(username=‘用户名’,password=‘密码’,email=‘邮箱’)
- 创建超级用户
- from django,contrib.auth.models import User
- user=User.objects.create_superuser(username=‘用户名’,password=‘密码’,email=‘邮箱’)
扩展内建用户表(增加用户内建表的字段)
-
方案一:
- 通过建立子表,跟内建表做一对一映射.(给新字段添加唯一约束和外键约束,然后关联附表主键字段)
-
方案二:
- 继承内建的抽象 user 模型类 1.
- 添加新的 django App.
- 定义模型类继承 AbstrcctUser
- setting.py 中指明 AUTH_USER_MODEL=‘新应用名.类名’
- notice:此操作必须要在项目(不是 app)第一次 migrate 之前执行.(即还未初始化,auth_user 表还未在数据库创建时.)
- 继承内建的抽象 user 模型类 1.
class UserInfo(AbstrcctUser):
pthon=models.CharField(max_length=11,default='')
校验用户密码
- 导包:from django,contrib.auth import authenticate
- 验证密码:user = authenticate(username=‘username’ password = ‘password’)
- 当用户名与密码校验成功后会返回一个对应的 user 对象,否则返回一个 None 值
修改用户密码
- 导包:from djang.contrib.auth.models import User
- 获取指定用户名的 user 对象:user=User.objects.get(username=‘username’)
- 重新设置用户密码:user.set_password(“new_password”)
- 提交:user.save()
from djang.contrib.auth.models import User
try:
user=User.objects.get(username='username')
user.set_password("new_password")
user.save()
return HttpResponse("修改密码成功!")
except:
return HttpResponse("修改密码失败!")
保持登录状态(只能存储 session,时间不可控)
from django.contrib.auth import login
def login_view(request):
#获取用户输入对象,并校验密码.
user=authenticate(username='username',password='password')
#将user对象存入session
login(request,user)
登录状态校验
from django.contrib.auth.decorators import login_required
@login_required
def index_view(request):
#该视图必须为用户登录状态下才可以访问,如未登录会自动跳转到指定网址:setting.py下的LOGIN_URL="/指定网站"
#当前登录用户可通过request.user获取
login_user=request.user
登录状态取消
from django.contrib.auth import logout
def logout_view(request):
logout(request)
Djnago 上传文件
-
规范:表单<form>中文件上传时,必须携带 enctype='multipart/form-data’时才会包含文件内容数据
-
表单中用<input type=‘file’ name=‘xxx’>标签上传文件
-
在项目里创建一个文件夹,命名为 media
-
setting.py 里配置 MEDIA_URL=‘/media/’
-
setting.py 里配置 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,decument_root=settings.MEDIA_ROOT)
文件上传函数:
-
传统方式:
@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+"成功")
-
借助 ORM 字段.
在创建表的时候,添加 FileField(upload=‘子目录名’)@csrf_exempt def upload_view_dj(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(desc=title,myfile=a_file) return HttpResponde('---upload is ok')
Djnago 发送邮件
-
在 setting.py 中配置发送邮件:
# 配置Django邮箱 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = "smtp.qq.com" # qq邮箱的SMTP服务器地址 EMAIL_PORT = 25 # SMTP的端口号 EMAIL_HOST_USER = '2212889205@qq.com' # 发送邮件的qq邮箱 EMAIL_HOST_PASSWORD = "kupinuekfsgvebfd" # POP3/IMAP内的授权码 EMAIL_USE_TLS = False # 进行SMTP服务通信时,是否启动TLS安全连接.默认False
-
调用发送函数:
from django.core import mail #from_emil:发件人 #recipient_list:收件人 mail.send_mail(subject='测试邮件',message='hello django emil',from_emil='2212889205@qq.com',recipient_list=['189915245@qq.com'])
Djnago uwsgi 项目部署
- 配置好服务器所需运行环境.
- 将项目迁移到服务器
- 使用 uWDGI 替换 python manage.py runserver
- 配置 nginx 反向代理服务器,来平衡分配用户访问呢的服务器,防止服务器过载
WSGI
- 概念:
- WSGI(Web Server GateWay Interface)web 服务器网关接口,是 python 应用程序或框架和 web 服务器之间的一种接口,被广泛使用.
- python manage.py runserver 通常只在开发和测试环境中使用.当开发结束后,完整的项目代码需要在一个稳定高效的环境中运行时就需要用 WSGI.
uWSGI
-
概念:uWSGI 是 WSGI 的一种,它实现类的 http 协议以及 uwsgi 协议,uWSGI 功能完善.支持协议多.在 python web 中使用广泛.
-
安装 uWSGI
-
uWSGi,需要在 Ubuntu(乌班图)或 linux 中安装.
-
linux 安装虚拟环境:
- mkvirtualenv tt // 创建名为 tt 的虚拟环境
- workon tt // 进入这个虚拟环境
-
安装指令:pip install uwsgi -i https://mirrors.aliyun.com/pypi/simple/
// 使用镜像源进行安装 -
检查是否安装成功:
- sudo pip3 freeze|grep -i ‘uwsgi’
- 安装成功会输出 uWSGI==2.0.18
-