首页 > 编程语言 > 详细

python学习第十八课

时间:2016-03-19 13:09:03      阅读:287      评论:0      收藏:0      [点我收藏+]

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)

       以上方法的返回值可以是NoneHttpResonse对象,如果是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

作用:

  1. 提交数据的验证

  2. 生成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 从远程服务器上请求文本、HTMLXML 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提交。

       该函数主要根据用于提交的有效表单控件的namevalue,将它们拼接为一个可直接用于表单提交的文本字符串,该字符串已经过标准的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() );

       我们也可以直接对部分表单元素进行序列化。

       // 序列化所有的textselectcheckbox表单元素

       // 序列化后的结果: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对象,该对象有namevalue属性,对应该表单控件的namevalue属性。然后将这些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‘)

 

 

python学习第十八课

原文:http://120662.blog.51cto.com/110662/1752791

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!