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.进入 ...
随机推荐
- 第二百七十九节,MySQL数据库-pymysql模块操作数据库
MySQL数据库-pymysql模块操作数据库 pymysql模块是python操作数据库的一个模块 connect()创建数据库链接,参数是连接数据库需要的连接参数使用方式: 模块名称.connec ...
- 以下( )可用于检索session属性userid的值。
A.session. getAttribute (“userid”); B.session. setAttribute (“userid”); C.request. getParameter (“us ...
- 10个网页设计师必备的CSS技巧(转)
英文原文:10 Essential CSS Rules for Web Designers CSS是网页设计师的基础,对CSS的了解能使他们能够设计出更加美观别致的网页.使用CSS技巧来巧妙地处理CS ...
- 【BZOJ】2555: SubString(后缀自动机)
http://www.lydsy.com/JudgeOnline/problem.php?id=2555 学到了如何快速维护right值orz (不过这仍然是暴力维护,可以卡到O(n) 首先我们在加一 ...
- mysql插入多行数据
表结构如图:
- typecho篇
百度百科的介绍: Typecho是由type和echo两个词合成的,来自于开发团队的头脑风暴. Typecho基于PHP5开发,支持多种数据库,是一款内核强健﹑扩展 方便﹑体验友好﹑运行流畅的轻量级开 ...
- ps -ef|grep htpd|wd -l
在Linux下查看Apache的 负载情况,以前也说过,最简单有有效的方式就 是查看Apache Server Status(如何开启Apache Server Status点这里),在没有开启Apa ...
- 滚动到指定位置js
function mScroll(id){ $("html,body").stop(true); $(); }
- Mac终端运行java程序
1.编辑源文件HelloWorld.java 2.编译源文件 javac HelloWorld.java 生成HelloWorld.class文件 3.执行java字节码 注意,一定要到源目录下,并且 ...
- LAMP环境搭建博客
背景: 公司要用到lamp环境,让我装,我就开始着手找资料,一般分为源码装和yum装,源码装很容易出错,所以我选择了yum装,. 服务器:aliyun服务器 centos6.8系统 按照第一个安装完 ...