补充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. 在函数体的“出口处”,对 return 语句的正确性和效率进行检查

    在函数体的“出口处”,对 return 语句的正确性和效率进行检查. 如果函数有返回值,那么函数的“出口处”是 return 语句. 我们不要轻视 return 语 句.如果 return 语句写得不 ...

  2. php -- 可变变量

    有时候使用可变变量名是很方便的.就是说,一个变量的变量名可以动态的设置和使用.一个普通的变量通过声明来设置,例如: <?php $a = 'hello'; ?> 一个可变变量获取了一个普通 ...

  3. uva624 CD (01背包+路径的输出)

    CD Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status Practice UVA 624 ...

  4. Maven的Settings.xml配置文件解释

    该配置用于单用户配置和全局配置, 单用户配置默认存放于 ${user.home}/.m2/目录中. 全局配置默认存放于Maven安装目录下面的conf目录中. 这两个默认的位置都可以修改. <? ...

  5. vue+webpack2实现路由的懒加载

    当打包构建应用时,Javascript 包会变得非常大,影响页面加载.如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了. 结合 Vue 的异步组 ...

  6. hdu1059(多重背包优化)

    使用一种二进制的优化, 可以完美的解决这题,<背包九讲>中说的非常好 但是还有一种线性复杂的算法. 应该算是该题很巧妙的解法 ;i++) { ;l--) { ) continue; ;k& ...

  7. Memcached 之 .NET(C#)实例分析

    一:Memcached的安装 step1. 下载memcache(http://jehiah.cz/projects/memcached-win32)的windows稳定版(这里我下载了memcach ...

  8. 使用jquery-qrcode生成二维码(转载)

    一.使用jquery-qrcode生成二维码 先简单说一下jquery-qrcode,这个开源的三方库(可以从https://github.com/jeromeetienne/jquery-qrcod ...

  9. LeetCode 笔记系列四 Remove Nth Node From End of List

    题目:Given a linked list, remove the nth node from the end of list and return its head.For example, Gi ...

  10. (转)MySQL百万级数据库优化

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...