http://www.cnblogs.com/wupeiqi/articles/5246483.html
一、URL 路由
url(r’^index/$’,views.inde), --普通写法
动态
url(r’^user_list/(\d+)$’,views.user_list), --带参数写法,数字
url(r‘^index/(\w*)$‘,views.index) 匹配单词
url(r’^user_list/(\d+)/(\w*)$’,views.user_list), --带多个参数
分级路由
urls.py
from django.conf.urls import include
url(r‘^app01/‘,include(‘app01.urls‘)) -去app01里找urls.py
如果写成’app01’,那浏览器写 aaapp01也会去app01里找urls.py 如果写成 ‘^app01/’,表示app01开头
app01/urls.py
import views
urlpatterns = [
url(r‘^index/$‘,views.index)
]
基于反射的路由
对于路由配置文件 urls.pv,使用正则表达式分组
from django.conf.urls import patterns, include, url --要import patterns
from django.contrib import admin
from DynamicRouter.activator import process –process为处理路由的函数
urlpatterns = patterns(‘‘,
url(r‘^admin/‘, include(admin.site.urls)),
(‘^(?P<app>(\w+))/(?P<function>(\w+))/(?P<page>(\d+))/(?P<id>(\d+))/$‘,process),
(‘^(?P<app>(\w+))/(?P<function>(\w+))/(?P<id>(\d+))/$‘,process),
(‘^(?P<app>(\w+))/(?P<function>(\w+))/$‘,process),
(‘^(?P<app>(\w+))/$‘,process,{‘function‘:‘index‘}), --这一行代表?
)
二、中间件
settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件
中间件中可以定义四个方法,分别是:
process_request(self,request)
process_view(self, request, callback, callback_args, callback_kwargs)
process_exception(self, request, exception)
process_response(self, request, response)
以上方法的返回值可以是None和HttpResonse对象,如果是None,则继续按照django定义的规则向下执行,如果是HttpResonse对象,则直接将该对象返回给用户。
我们从浏览器发出一个请求 Request,得到一个响应后的内容 HttpResponse ,这个请求传递到 Django的过程如下:
每一个请求都是先通过中间件中的 process_request 函数,这个函数返回 None 或者 HttpResponse 对象,如果返回前者,继续处理其它中间件,如果返回一个 HttpResponse,就处理中止,返回到网页上。
可以在这一层做一些功能,对进来的请求,根据request的值来判断,比如IP拦截(获取当前访问者的 IP request.META[‘REMOTE_ADDR‘]);对要返回客户端的值进行处理后再返回,比如针对不同的用户返回不同的异常
import sys
from django.views.debug import technical_500_response
from django.conf import settings
class UserBasedExceptionMiddleware(object):
def process_exception(self, request, exception):
if request.user.is_superuser or request.META.get(‘REMOTE_ADDR‘) in settings.INTERNAL_IPS:
return technical_500_response(request, *sys.exc_info()) ――http://www.ziqiangxuetang.com/
三、Form
作用:
提交数据的验证
生成html标签
创建过程
a. 先创建类 class user_form(forms.Form)
类中包含字段
username = forms.CharField()
pwd = forms.CharField()
email = forms.EmailField()
b. 函数中创建对象 obj = user_form()
通过render,将这个类的对象传给前端
render(request,’xxx.html’,{‘obj’:obj})
c. 前端生成相应表单
{{obj}} --最简单使用,或:
{{obj.username}} {{obj.pwd}} ……。
d. 前端提交(submit <form action="/app01/login/" method="post">),request.POST给后端
e. 后端将request.POST封装给对象
user_input_obj = user_form(request.POST)
如果它有效,就将它值取出
if user_input_obj.is_valid():
data = user_input_obj.clean()
此时的data是个字典
{‘username‘: u‘han‘, ‘gender‘: u‘nam‘, ‘pwd‘: u‘123‘, ‘email‘: u‘han@163.com‘}
如果无效,通过render,把它和错误信息一起返给前端
error_msg = user_input_obj.errors--(as_data() as_json() as_ul())
return render(request,‘login.html‘,{‘obj‘:user_input_obj,‘errors‘:error_msg})
error_msg 的类型为<class ‘django.forms.utils.ErrorDict‘>,它的值类似
<ul>
<li>username
<ul><li>This field is required.</li>
</ul></li>
<li>gender
<ul><li>This field is required.</li>
</ul></li>
<li>pwd
<ul>
<li>This field is required.</li></ul></li>
<li>email
<ul>
<li>This field is required.</li></ul></li>
</ul>
error_msg在前端的展示是
{{error.username}} 会显示
此处 obj 与 user_input_obj的区别是,obj里没有值,而user_input_obj里有之前提交的值
Cookie Session
cookie 存在本地
sesssion 存在服务端
只要写上request.session[‘key’]=value,就表示设置了session,使用request.session.get(key) 就可以得到value
默认情况下,sesson存储在你自己的数据库中(使用model django.contrib.session.models.Session),它也可以存储在文件系统或者cache中。https://docs.djangoproject.com/en/1.9/topics/http/sessions/#module-django.contrib.sessions
django-admin clearsessions 会清除session
四、Ajax
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。
AJAX 是与服务器交换数据并更新部分网页的艺术,不需要重新加载整个页面。
jQuery 提供多个与 AJAX 有关的方法。通过 jQuery AJAX 方法,您能够使用 HTTP Get 和 HTTP Post 从远程服务器上请求文本、HTML、XML 或 JSON - 同时您能够把这些外部数据直接载入网页的被选元素中。
jQuery load() 方法是简单但强大的 AJAX 方法。load() 方法从服务器加载数据,并把返回的数据放入被选元素中。
$(selector).load(URL,data,callback);
必需的 URL 参数规定加载的 URL
可选的 data 参数规定与请求一同发送的查询字符串键/值对集合。
可选的 callback 参数是 load() 方法完成后所执行的函数名称。
$("#div1").load("demo_test.txt");
也可以把 jQuery 选择器添加到 URL 参数。
下面的例子把 "demo_test.txt" 文件中 id="p1" 的元素的内容,加载到指定的 <div> 元素中:
$("#div1").load("demo_test.txt #p1");
目前测试只能load静态文件,且必须存放在 static 目录下,同一目录都不行
可选的 callback 参数规定当 load() 方法完成后所要允许的回调函数。回调函数可以设置不同的参数:
responseTxt - 包含调用成功时的结果内容
statusTXT - 包含调用的状态
xhr - 包含 XMLHttpRequest 对象
下面的例子会在 load() 方法完成后显示一个提示框。如果 load() 方法已成功,则显示"外部内容加载成功!",而如果失败,则显示错误消息:
$("button").click(function(){
$("#div1").load("demo_test.txt",function(responseTxt,statusTxt,xhr){
if(statusTxt=="success")
alert("External content loaded successfully!");
if(statusTxt=="error")
alert("Error: "+xhr.status+": "+xhr.statusText);
});
});
$.get() 方法通过 HTTP GET 请求从服务器上请求数据。
$.get(URL,callback);
必需的 URL 参数规定您希望请求的 URL。
可选的 callback 参数是请求成功后所执行的函数名。
下面的例子使用 $.get() 方法从服务器上以get方式从ajax_get函数中取数据:
$(function(){
$.get("/ajax_get/",function(data,status){
alert("Data: " + data + "\nStatus: " + status);
})
})
$.get() 的第一个参数是我们希望请求的 URL(" ajax_get ")。
第二个参数是回调函数。第一个回调参数存有被请求页面的内容,第二个回调参数存有请求的状态。
urls.pv
url(r‘^ajax_get/‘,views.ajax_get),
views.py
def ajax_get(request):
return HttpResponse("ok")
上例中,ajax_get返回 ok 给data
$.post() 方法通过 HTTP POST 请求从服务器上请求数据。
$.post(URL,data,callback);
必需的 URL 参数规定您希望请求的 URL。
可选的 data 参数规定连同请求发送的数据。
可选的 callback 参数是请求成功后所执行的函数名。
下面的例子使用 $.post() 连同请求一起发送数据:
$("button").click(function(){
$.post("/ajax_post",
{
name:"Donald Duck",
city:"Duckburg"
},
function(data,status){
alert("Data: " + data + "\nStatus: " + status);
});
});
GET 与 POST的区别
GET - 从指定的资源请求数据
POST - 向指定的资源提交要处理的数据
GET 基本上用于从服务器获得(取回)数据。注释:GET 方法可能返回缓存数据。
POST 也可用于从服务器获取数据。不过,POST 方法不会缓存数据,并且常用于连同请求一起发送数据。
ajax() 方法用于执行 AJAX(异步 HTTP)请求
$.ajax({name:value, name:value, ... })
名称 值/描述
url 规定发送请求的 URL。默认是当前页面。
type 规定请求的类型(GET 或 POST)。
data 规定要发送到服务器的数据。
success(result,status,xhr) 当请求成功时运行的函数。
error(xhr,status,error) 如果请求失败要运行的函数。
dataType 预期的服务器响应的数据类型。
traditional 布尔值,规定是否使用参数序列化的传统样式。
jQuery.getJSON(url,data,success(data,status,xhr))
$.getJSON("/username_valide/",{"username":input_username},function(ret){
if (ret["ret"] == "0"){
$("#form-register #name-ok").removeClass("hide");
$("#form-register #name-exist").addClass("hide");
}else if (ret["ret"] == "1"){
$("#form-register #name-ok").addClass("hide");
$("#form-register #name-exist").removeClass("hide");
}
})
jQuery.parseJSON()函数用于将格式完好的JSON字符串转为与之对应的JavaScript对象。
所谓"格式完好",就是要求指定的字符串必须符合严格的JSON格式,例如:属性名称必须加双引号、字符串值也必须用双引号。
如果传入一个格式不"完好"的JSON字符串将抛出一个JS异常,例如:以下字符串均符合JSON格式,但它们不是格式完好的JSON字符串(因此会抛出异常):
// 以下均是字符串值,省略了两侧的引号,以便于展现内容
{id: 1} // id是属性名称,必须加双引号
{‘id‘: 1} // id是属性名称,必须用双引号(不能用单引号)
{"name": ‘CodePlayer‘} // name属性的值是字符串,必须用双引号(不能用单引号)
jQuery.serialize()函数用于序列化一组表单元素,将表单内容编码为用于提交的字符串。
jQuery.serialize()函数常用于将表单内容序列化,以便用于AJAX提交。
该函数主要根据用于提交的有效表单控件的name和value,将它们拼接为一个可直接用于表单提交的文本字符串,该字符串已经过标准的URL编码处理(字符集编码为UTF-8)。
该函数不会序列化不需要提交的表单控件,这和常规的表单提交行为是一致的。例如:不在<form>标签内的表单控件不会被提交、没有name属性的表单控件不会被提交、带有disabled属性的表单控件不会被提交、没有被选中的表单控件不会被提交。
与常规表单提交不一样的是:常规表单一般会提交带有name的按钮控件,而serialize()函数不会序列化带有name的按钮控件。
对<form>元素进行序列化可以直接序列化其内部的所有表单元素。
// 序列化<form>内的所有表单元素
// 序列化后的结果:uid=1&username=%E5%BC%A0%E4%B8%89&password=123456&grade=3&sex=1&hobby=1&hobby=2
alert( $("form").serialize() );
我们也可以直接对部分表单元素进行序列化。
// 序列化所有的text、select、checkbox表单元素
// 序列化后的结果:username=%E5%BC%A0%E4%B8%89&password=123456&grade=3&hobby=1&hobby=2
alert( $(":text, select, :checkbox").serialize() );
serialize()函数通常用于将表单内容序列化,以便通过AJAX方式提交。
$("#btn").click( function(){
// 将当前表单内容以POST请求的AJAX方式提交到"http://www.365mini.com"
$.post( "http://www.365mini.com", $("form").serialize(), function( data, textStatus, jqXHR ){
alert( "AJAX提交成功!" );
} );
} );
jQuery.serializeArray()
serializeArray()函数用于序列化一组表单元素,将表单内容编码为一个JavaScript数组。
serializeArray()函数常用于将表单内容序列化为JSON对象,以便于被编码为JSON格式的字符串。
该函数会将可用于提交的每个表单控件封装成一个Object对象,该对象有name和value属性,对应该表单控件的name和value属性。然后将这些Object对象封装为一个数组并返回。
该函数不会序列化不需要提交的表单控件,这和常规的表单提交行为是一致的。例如:不在<form>标签内的表单控件不会被提交、没有name属性的表单控件不会被提交、带有disabled属性的表单控件不会被提交、没有被选中的表单控件不会被提交。
与常规表单提交不一样的是:常规表单一般会提交带有name的按钮控件,而serializeArray()函数不会序列化带有name的按钮控件。
对<form>元素进行序列化可以直接序列化其内部的所有表单元素。
var formArray = $("form").serializeArray();
/* 以下是序列化后的结果数组formArray的内容:
[
{ name: "uid", value: "1" },
{ name: "username", value: "张三" },
{ name: "password", value: "123456" },
{ name: "grade", value: "3" },
{ name: "sex", value: "1" },
{ name: "hobby", value: "1" },
{ name: "hobby", value: "2" }
];
*/
我们也可以直接对部分表单元素进行序列化。
var result = $(":text, select, :checkbox").serializeArray();
/* 以下是序列化后的结果数组result的内容:
[
{ name: "username", value: "张三" },
{ name: "password", value: "123456" },
{ name: "grade", value: "3" },
{ name: "hobby", value: "1" },
{ name: "hobby", value: "2" }
];
*/
更多 http://www.w3school.com.cn/jquery/jquery_ref_ajax.asp
例:
$.ajax({
url:’’,
type:’POST’,
data:{k1:’v1,k2:’v2’},
success:function(arg){
}
})
function AjaxSubmitSet(){
var array_users= [
{‘username‘: ‘alex‘, ‘age‘: 18},
{‘username‘: ‘rain‘, ‘age‘: 16},
{‘username‘: ‘eric‘, ‘age‘: 17}
];
$(‘#ajaxsubmit‘).click(function(){
$.ajax({
url: "/ajax_data_set/",
type: ‘POST‘,
tradition: true,
data: {data: JSON.stringify(array_users)},
success: function(arg){
// json.loads
var callback_dict = $.parseJSON(arg);
if(callback_dict.status){
alert(‘成功‘);
}else{
alert(callback_dict.error);
}
}
});
}
views.py
import json
def ajax_data_set(request):
ret = {‘status‘: True, ‘error‘:""}
try:
print request.POST
except Exception,e:
ret[‘status‘] = False
ret[‘error‘] = str(e)
return HttpResponse(json.dumps(ret))
传过去的data为一个列表(也可以是字典),因为只能传输字符串格式,所以用JSON.stringify将它封装成json格式
request.POST的类型为 <class ‘django.http.request.QueryDict‘>
值为 <QueryDict: {u‘data‘: [u‘[{"username":"alex","age":18},{"username":"rain","age":16},{"username":"eric","age":17}]‘]}>
request.POST[‘data‘]的类型为<type ‘unicode‘>
值为[{"username":"alex","age":18},{"username":"rain","age":16},{"username":"eric","age":17}]
转化为正常格式json.loads(request.POST[‘data‘] ) 后类型变为list,就可以常规方式访问了
五、缓存
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者Redis中,15分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回,
Django settings 中 cache 默认为
{
‘default‘: {
‘BACKEND‘: ‘django.core.cache.backends.locmem.LocMemCache‘,
}
}
也就是默认利用本地的内存来当缓存,速度很快。当然可能出来内存不够用的情况,其它的一些内建可用的 Backends 有
‘django.core.cache.backends.db.DatabaseCache‘
‘django.core.cache.backends.dummy.DummyCache‘
‘django.core.cache.backends.filebased.FileBasedCache‘
‘django.core.cache.backends.locmem.LocMemCache‘
‘django.core.cache.backends.memcached.MemcachedCache‘
‘django.core.cache.backends.memcached.PyLibMCCache‘
利用文件系統做緩沖配置
CACHES = {
‘default‘: {
‘BACKEND‘: ‘django.core.cache.backends.filebased.FileBasedCache‘, --文件系统
‘LOCATION‘: os.path.join(BASE_DIR, ‘cache‘), --位置
‘TIMEOUT‘: 600,
‘OPTIONS‘: {
‘MAX_ENTRIES‘: 100
}
}
}
利用数据库来缓存,需要利用命令创建相应的表:python manage.py createcachetable cache_table_name
CACHES = {
‘default‘: {
‘BACKEND‘: ‘django.core.cache.backends.db.DatabaseCache‘,
‘LOCATION‘: ‘cache_table_name‘,
‘TIMEOUT‘: 600,
‘OPTIONS‘: {
‘MAX_ENTRIES‘: 2000
}
}
}
应用
from django.shortcuts import render, HttpResponse
from django.views.decorators.cache import cache_page
@cache_page(60 * 15) --15分钟
def func(request):
return HttpResponse(‘xxx‘)
原文:http://120662.blog.51cto.com/110662/1752791