补充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">&times;</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_抽屉项目】的更多相关文章

  1. python16_day20【Django_继续抽屉项目】

    一.djangoAdmin和表结构 1.项目名称 python manage startapp web # 前端页面 python manage startapp repository   # 只是数 ...

  2. Django_创建项目

    安装django pip install Django 将下面路径添加到系统环境变量的path中 C:\Users\12978\AppData\Local\Programs\Python\Python ...

  3. django 表结构

    django 表结构 一:查看orm写的sq语句:如果对某个语句不清楚的话可以调用queryset的的query方法来查看sql. 1 obj=Hostinfo.objects.filter(id=v ...

  4. tornado web高级开发项目之抽屉官网的页面登陆验证、form验证、点赞、评论、文章分页处理、发送邮箱验证码、登陆验证码、注册、发布文章、上传图片

    本博文将一步步带领你实现抽屉官网的各种功能:包括登陆.注册.发送邮箱验证码.登陆验证码.页面登陆验证.发布文章.上传图片.form验证.点赞.评论.文章分页处理以及基于tornado的后端和ajax的 ...

  5. Django_项目初始化

    如何初始Django运行环境? 1. 安装python 2. 创建Django项目专用的虚拟环境 http://www.cnblogs.com/2bjiujiu/p/7365876.html 3.进入 ...

  6. Django_博客项目 引入外部js文件内含模板语法无法正确获取值得说明和处理

    问题描述 : 项目中若存在对一段js代码复用多次的时候, 通常将此段代码移动到一个单独的静态文件中在被使用的地方利用 script 标签的 src 属性进行外部调用 但是如果此文件中存在使用 HTML ...

  7. Django_博客项目 注册用户引发 ValueError: The given username must be set

    博客项目中 注册功能在ajax 提交数据时 报错 ValueError: The given username must be set 锁定到错误点为 判定为是无法获取到 username 字段 那先 ...

  8. Python之路【第二十篇】:python项目之旧版抽屉新热榜

    旧版抽屉新热榜 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  9. Django_项目开始

    如何初始Django运行环境? 1. 安装python 2. 创建Django项目专用的虚拟环境 http://www.cnblogs.com/2bjiujiu/p/7365876.html 3.进入 ...

随机推荐

  1. java----EL表达式

     Java Web中的EL(表达式语言)详解 表达式语言(Expression Language)简称EL,它是JSP2.0中引入的一个新内容.通过EL可以简化在JSP开发中对对象的引用,从而规范页面 ...

  2. jquery cdn加速注意事项

    1, <script src="http://libs.baidu.com/jquery/1.7.2/jquery.min.js"></script> 这里 ...

  3. 如何编写jQuery插件

    要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈 ...

  4. 将数据写入TXT文件中,file_put_contents与fwrite

    <?php header("content-type:text/html;charset=utf-8"); $file = './aa.txt'; ###判断是不是文件 if ...

  5. ACM计算几何模板——二维几何基础(基本运算,点和线,多边形)

    /*==========================*\ | 计算几何基础函数 | | 1.点和向量的定义 | | 2.向量的基本运算 | | 3.点积 | | 4.向量长度 | | 5.两向量角 ...

  6. 如何在ChemDraw中缩短双键长度

    双键是化学绘图软件ChemDraw在绘制化学图形的过程中会遇到各种各样的化学结构.而双键就是一种常见的化学基础结构,有的用户希望自己绘制的图形更加的美观,希望可以调整双键的长度并且不影响到其他的结构. ...

  7. ssm异步上传图片

    1.首先引入jersey   jar包 2.在配置文件中,配置允许上传图片 3.修改增加商品页面 <%@ page language="java" import=" ...

  8. nginx 服务器重启命令,关闭(转)

    nginx -s reload  :修改配置后重新加载生效 nginx -s reopen  :重新打开日志文件nginx -t -c /path/to/nginx.conf 测试nginx配置文件是 ...

  9. JavaIo编程基础复习

    什么是Io io是指Input和Output,指输入和输出 Input是指外部读入数据到内存,例如读取一个文件,或者从网络中读取 Output是指把内存中的数据输出到外部,例如写文件,输出到网络 什么 ...

  10. 170324、Spring 处理器和Resource

    1.Spring 框架允许开发者使用两种后处理器扩展 IoC 容器,这两种后处理器扩展 IoC 容器,这两种后处理器可以后处理 IoC 容器本身,或对容器中所有的 Bean 进行后处理.IoC 容器还 ...