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.进入 ...
随机推荐
- 006杰信—factory更新数据
本博客的资源全部来源于传智播客. factroy更新的执行流程和003杰信-在jsp页面输入数据,然后在oracle数据库中插入factory数据,当字段允许为空时要特殊处理差不多, 1.在jFact ...
- bootstrap基础学习五篇
bootstrap表格 Bootstrap 提供了一个清晰的创建表格的布局.下表列出了 Bootstrap 支持的一些表格元素: 标签 描述 <table> 为表格添加基础样式. < ...
- 解决spring boot中rest接口404,500等错误返回统一的json格式
在开发rest接口时,我们往往会定义统一的返回格式,列如: { "status": true, "code": 200, "message" ...
- MathType二次偏导怎么表示
求导以及求偏导运算在数学中是很重要的一个部分,尤其是在高等数学中,基本都由函数的导数与偏导组成,很多公式定理也是关于这方面的,如果少了这一部分,数学将会黯然失色.因此在文档中涉及到这些内容时,必然会少 ...
- Ubantu apt source 国内
位置 /etc/apt/sources.list apt-get update deb http://mirrors.163.com/ubuntu/ precise main restricted u ...
- Hadoop1.2.1 伪分布式安装
Hadoop1.2.1 单机模式安装 Hadoop组件依赖图(从下往上看) 安装步骤: 详细步骤: 设置ssh自动登录(如下图): 1.输入命令 [ssh-keygen -t rsa],然后一直按回车 ...
- Django学习笔记第七篇--实战练习三--关于更有层级的url请求、404错误以及其他响应函数
一.关于更有层级的URL: 可以实现每一个APP一个子URL目录,例如app1的所有操作都在http://www.localhost1.com:5443/app1/xxxx 在工程主文件夹下的工程同名 ...
- 《从零开始学Swift》学习笔记(Day 71)——Swift与C/C++混合编程之数据类型映射
原创文章,欢迎转载.转载请注明:关东升的博客 如果引入必要的头文件,在Objective-C语言中可以使用C数据类型.而在Swift语言中是不能直接使用C数据类型,苹果公司为Swift语言提供与C语言 ...
- Arduino开发版学习计划--蜂鸣器
文章内容参考:http://www.cnblogs.com/xiaowuyi/p/3343757.html 遇到不懂的方法,可以查看Arduino自带的API 就直接点击arduino的IDE里面菜单 ...
- Java项目使用oh-my-email发送邮件
本文使用Github开源项目oh-my-email进行测试邮件发送,并未进行更为深度的测试,如果想要快速使用,的确是一个很好的邮件发送组件.https://github.com/biezhi/oh-m ...