python16_day19【Django_抽屉项目】
补充ORM块:
1.select_related() # 解决:当有外健,规避多决查询,使用了join. 多次查询变成一次查询
例:UserInfo.objects.all().select_related('ut') # FK字段名称
2.prefetch_related() # 解决: 当使用join表太多,性能下降,将每次join查询分解单表查询,拿到数据再组合。
例:UserInfo.objects.filter(id=1).prefetch_realated('ut') # FK字段名称
3.通常UserInfo.objects.all()取数据性能不高,和values or vlaues_list基本差不多
(1) UserInfo.objects.all().only('id,'name') # 只取这两列,但是当你取数据的时候其实其它字段也是可以取的,那样性能又和all()一样了。
(2) UserInfo.objects.all().defer('id) # 除了这列都取
一、缓存
基于内存缓存配置:
1.settings.py
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake',
'TIMEOUT': 300, # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
'OPTIONS': {
'MAX_ENTRIES': 300, # 最大缓存个数(默认300)
'CULL_FREQUENCY': 10, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
},
# 'KEY_PREFIX': 'prev', # 缓存key的前缀(默认空)
# 'VERSION': 1, # 缓存key的版本(默认1)
# 'KEY_FUNCTION' 函数名 # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
}
}
2.全站使用缓存
MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware',
# 其他中间件...
'django.middleware.cache.FetchFromCacheMiddleware',
]
3.单独视图使用
from django.shortcuts import render
import time
from django.views.decorators.cache import cache_page @cache_page(10) # 10秒
def index(request):
ctime = time.time()
return render(request,'index.html',{'ctime': ctime})
templates/index.html
<h3>{{ ctime }}</h3>
4.页面局部使用
templates/index.html
{% load cache %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
{% cache 5000 keyname %}
<h1>{{ ctime }}</h1>
{% endcache %} <h3>{{ ctime }}</h3>
</body>
二、信号
1.内置信号
Model signals
pre_init # django的modal执行其构造方法前,自动触发
post_init # django的modal执行其构造方法后,自动触发
pre_save # django的modal对象保存前,自动触发
post_save # django的modal对象保存后,自动触发
pre_delete # django的modal对象删除前,自动触发
post_delete # django的modal对象删除后,自动触发
m2m_changed # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
class_prepared # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
Management signals
pre_migrate # 执行migrate命令前,自动触发
post_migrate # 执行migrate命令后,自动触发
Request/response signals
request_started # 请求到来前,自动触发
request_finished # 请求结束后,自动触发
got_request_exception # 请求异常后,自动触发
Test signals
setting_changed # 使用test测试修改配置文件时,自动触发
template_rendered # 使用test测试渲染模板时,自动触发
Database Wrappers
connection_created # 创建数据库连接时,自动触发
2.配置
mysite/mysite/__init__.py
from django.core.signals import request_finished
from django.core.signals import request_started
from django.core.signals import got_request_exception from django.db.models.signals import class_prepared
from django.db.models.signals import pre_init, post_init
from django.db.models.signals import pre_save, post_save
from django.db.models.signals import pre_delete, post_delete
from django.db.models.signals import m2m_changed
from django.db.models.signals import pre_migrate, post_migrate from django.test.signals import setting_changed
from django.test.signals import template_rendered from django.db.backends.signals import connection_created # sender 请求的所有信息
def callback(sender, **kwargs):
print("xxoo_callback")
print(sender,kwargs) request_finished.connect(callback)
3.自定义信号
a.定义信号
import django.dispatch
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
b.注册信号
def callback(sender, **kwargs):
print("callback")
print(sender,kwargs) pizza_done.connect(callback
c.触发信号
from 路径 import pizza_done
pizza_done.send(sender='seven',toppings=123, size=456)
三、模态+Ajax+Form验证
1.templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css"> <style>
.modal-body span {
color:red;
} .modal-body p {
margin-left: 100px;
}
</style>
</head>
<body> <!--按钮 -->
<button id="tologin" type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
登录
</button> <!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title" id="myModalLabel">登录</h4>
</div>
<div class="modal-body">
<p><input type="text" id="username" name="username" placeholder="用户名" /></p>
<p><input type="password" id="password" name="password" placeholder="密码"/></p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
<button id="sbm" type="button" class="btn btn-primary">提交</button>
</div>
</div>
</div>
</div> <script src="/static/jquery-1.12.4.js"></script>
<script src="/static/bootstrap-3.3.7-dist/js/bootstrap.js"></script> <script>
$(function () {
$('#sbm').click(function () {
$.ajax({
url: '/login/',
type: 'POST',
data: {'username': $('#username').val(),'password': $('#password').val()},
dataType: 'JSON',
success:function (arg) {
if(arg.status){
}else{
$.each(arg.error,function (k,v) {
// k = username,v = ["This field is required",]
var tag = document.createElement('span');
tag.innerHTML = v[0];
$('#' + k).next().remove();
$('#' + k).after(tag);
})
}
}
}) })
})
</script>
</body>
</html>
2.urls.py
url(r'^index/', views.index),
url(r'^login/', views.login),
3.views.py
from django.shortcuts import render, HttpResponse
import time
from app01.models import *
import json
from django.forms import Form
from django.forms import fields # Create your views here.
# 规范返回数据
class BaseReponse:
def __init__(self):
self.status = False
self.data = None
self.error = None # 表单验证
class LoginForm(Form):
username = fields.CharField(error_messages={'required': "用户名不能为空"})
password = fields.CharField(error_messages={'required': "密码不能为空"}) # 页面
def index(request):
return render(request, 'index.html', locals()) # 验证视图
def login(request):
response = BaseReponse()
try:
obj = LoginForm(request.POST)
if obj.is_valid():
v = UserInfo.objects.filter(**obj.cleaned_data).first()
if v:
response.status = True
request.session['username']= v.username
else:
response.status = False
response.error = "用户名或密码错误"
else:
response.status = False
response.error = obj.errors
except Exception as e:
response.status = False return HttpResponse(json.dumps(response.__dict__, ensure_ascii=False))
4."登录"或者"用户名"
{% if request.session.username %}
{{ request.session.username }}
{% else %}
登录
{% endif %}
四、三种上传方式
方式一:Form表单上传文件
1.views.py
def upload(request):
if request.method == 'GET':
return render(request, 'upload.html')
else:
obj = request.FILES.get('fffff')
f = open(obj.name, 'wb')
for chunk in obj.chunks():
f.write(chunk)
f.close()
return render(request, 'upload.html', locals())
2.templates/upload.html
<form action="/upload/" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="fffff" >
<input type="submit" value="提交">
</form>
方式二:Ajax上传文件(只支持新浏览器HMTL5)
1.views.py
def ajaxupload(request):
import os
response = BaseReponse()
try:
obj = request.FILES.get('fffff')
file_path = os.path.join('static', obj.name)
f = open(file_path, 'wb')
for chunk in obj.chunks():
f.write(chunk)
f.close()
response.status = True
response.data = file_path
except Exception as e:
response.status = False
return HttpResponse(json.dumps(response.__dict__, ensure_ascii=False))
2.templates/upload.html
<h1>方式二:Ajax上传文件(不兼容老浏览器)</h1>
<input type="file" id="ggggg">
<a id="btn1">提交</a> <script src="/static/jquery-1.12.4.js"></script>
<script src="/static/jquery.cookie.js"></script> # 从COOKIE获取CSRF的信息。
<script>
$(function(){
$("#btn1").click(function(){
var fm = new FormData();
fm.append('fffff', document.getElementById('ggggg').files[0]);
$.ajax({
url: "/ajaxupload/",
type: 'POST',
data: fm,
headers:{ "X-CSRFtoken":$.cookie("csrftoken")}, # 解决CSRF
processData: false, // tell jQuery not to process the data
contentType: false, // tell jQuery not to set contentType
success:function(arg){
console.log(arg);
}
})
})
})
</script>
方式三:iframe上传文件(伪ajax)
1.views.py
def ifreamupload(request):
import os
response = BaseReponse()
if request.method == 'GET':
return render(request, 'ifreamupload.html')
else:
try:
obj = request.FILES.get('fffff')
file_path = os.path.join('static', obj.name)
f = open(file_path, 'wb')
for chunk in obj.chunks():
f.write(chunk)
f.close()
response.status = True
response.data = file_path
except Exception as e:
response.status = False
return HttpResponse(json.dumps(response.__dict__, ensure_ascii=False))
2.templates/ifreamupload.html
<h1>iframe upload</h1>
<form action="/ifreamupload/" method="post" id="ff1" enctype="multipart/form-data" target="ifr">
{% csrf_token %}
<input type="file" name="fffff" onchange="changeImg();">
</form>
<iframe id="ifr" name="ifr" onload="successBack();" style="display: none"></iframe>
<div id="prevImg"></div> <script src="/static/jquery-1.12.4.js"></script>
<script>
// 获取回来的数据信息.
function successBack(){
var v = $('#ifr').contents().find('body').html();
var obj = JSON.parse(v); var tag = document.createElement('img');
tag.src = '/' + obj.data;
console.log(tag);
$("#prevImg").append(tag);
} // 自动提交,不需要提交按钮.
function changeImg(){
document.getElementById('ff1').submit();
}
</script>
python16_day19【Django_抽屉项目】的更多相关文章
- python16_day20【Django_继续抽屉项目】
一.djangoAdmin和表结构 1.项目名称 python manage startapp web # 前端页面 python manage startapp repository # 只是数 ...
- Django_创建项目
安装django pip install Django 将下面路径添加到系统环境变量的path中 C:\Users\12978\AppData\Local\Programs\Python\Python ...
- django 表结构
django 表结构 一:查看orm写的sq语句:如果对某个语句不清楚的话可以调用queryset的的query方法来查看sql. 1 obj=Hostinfo.objects.filter(id=v ...
- tornado web高级开发项目之抽屉官网的页面登陆验证、form验证、点赞、评论、文章分页处理、发送邮箱验证码、登陆验证码、注册、发布文章、上传图片
本博文将一步步带领你实现抽屉官网的各种功能:包括登陆.注册.发送邮箱验证码.登陆验证码.页面登陆验证.发布文章.上传图片.form验证.点赞.评论.文章分页处理以及基于tornado的后端和ajax的 ...
- Django_项目初始化
如何初始Django运行环境? 1. 安装python 2. 创建Django项目专用的虚拟环境 http://www.cnblogs.com/2bjiujiu/p/7365876.html 3.进入 ...
- Django_博客项目 引入外部js文件内含模板语法无法正确获取值得说明和处理
问题描述 : 项目中若存在对一段js代码复用多次的时候, 通常将此段代码移动到一个单独的静态文件中在被使用的地方利用 script 标签的 src 属性进行外部调用 但是如果此文件中存在使用 HTML ...
- Django_博客项目 注册用户引发 ValueError: The given username must be set
博客项目中 注册功能在ajax 提交数据时 报错 ValueError: The given username must be set 锁定到错误点为 判定为是无法获取到 username 字段 那先 ...
- Python之路【第二十篇】:python项目之旧版抽屉新热榜
旧版抽屉新热榜 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- Django_项目开始
如何初始Django运行环境? 1. 安装python 2. 创建Django项目专用的虚拟环境 http://www.cnblogs.com/2bjiujiu/p/7365876.html 3.进入 ...
随机推荐
- iScroll框架的使用和修改
iScroll 的诞生是因为手机 Webkit 浏览器(iPhone.iPod.Android 和 Pre)本身没有为固定宽度和高度的元素提供滚动内容的方法.这导致了很多网页使用 position:a ...
- html -- contenteditable 属性:指定元素内容是否可编辑
所有主流浏览器都支持 contenteditable 属性 定义和用法 contenteditable 属性指定元素内容是否可编辑. 注意: 当元素中没有设置 contenteditable 属性时, ...
- duilib Webkit内核dui化浏览器控件
參考http://blog.csdn.net/zhuhongshu/article/details/38540711 改进: 1.跟其它duilib控件一样,不包括窗体 2.将onURLChanged ...
- mysql 分页sql
-- pageSize=3 pageIndex total=7 -- 开始行号 startRowNum=(pageIndex-1)*pageSize+1; -- 结束行号 endRowNum=page ...
- 使用ADO GetChunk/AppendChunk 数据库存取二进制文件图象
在设计数据库的过程中,我们会经常要存储一些图形.长文本.多媒体(视频.音频文件)等各种各样的程序文件,如果我们在数据库中仅存储这些文件的路径信息,尽管这可以大大地减小数据库的大小,但是由于文件存在磁盘 ...
- win7win8 64位汇编开发环境合集安装与设置
win7win8 64位汇编开发环境合集安装与设置 下载 win7 win8 64位汇编开发环境.rar 下载地址(免积分下载) http://download.csdn.net/detail/li ...
- 系统管理模块_岗位管理_实现CRUD功能的具体步骤并设计Role实体
系统管理模块_岗位管理_实现CRUD功能的具体步骤并设计Role实体 1,设计实体/表 设计实体 --> JavaBean --> hbm.xml --> 建表 设计Role实体 p ...
- Object Slicing in C++
In C++, a derived class object can be assigned to base class, but the other way is not possible. cla ...
- keyword static
1. 不能通过类名来调用类的非静态成员函数 2. 类的对象可以使用静态成员函数和非静态成员函数 3. 静态成员函数中不能引用非静态成员 因为静态成员函数属于整个类, 在类的实例化对象之前就已经分配了空 ...
- ASp.Net控件的生命周期
服务端事件 页面生命周期 描述 Init Initialization 初始化控件树 LoadViewState Unpack ViewState 从ViewState里提取出状态信息 LoadCon ...