您的位置:首页 > 编程语言 > Python开发

python学习第十八课

2016-03-19 04:25 423 查看
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 patternsfrom django.contrib import adminfrom 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 sysfrom django.views.debug import technical_500_responsefrom 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 Sessioncookie 存在本地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四、AjaxAJAX = 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.loadsvar callback_dict = $.parseJSON(arg);if(callback_dict.status){alert('成功');}else{alert(callback_dict.error);}}});}views.pyimport jsondef ajax_data_set(request):ret = {'status': True, 'error':""}try:print request.POSTexcept Exception,e:ret['status'] = Falseret['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')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息