11.14技术上的一些总结

获取ul下li标签里点击的是哪一个li并获取li里a标签的值

$("ul li").click(function(){
    //获取当天月份
    var month_string =  $(this).find("a").eq(0).text();
    var month = month_string.substring(0,1)
    alert(month);

 });

Django使用request和response对象



当 请求一张页面时,Django把请求的metadata数据包装成一个HttpRequest对象,然后Django加载合适的view方法,把这个 HttpRequest 对象作为第一个参数传给view方法。任何view方法都应该返回一个HttpResponse对象。

我们在本书中大量使用这两个对象;本附录详细解释HttpRequest和HttpResponse对象。

HttpRequest

HttpRequest代表一个来自uesr-agent的HTTP请求。

大多重要的请求信息都是作为HttpRequest 对象的属性出现(see Table H-1). 除了session外,其他所有属性都是只读的。

Table H-1. HttpRequest对象的属性

Attribute


Description

path


请求页面的全路径,不包括域名—例如, "/music/bands/the_beatles/"method


请求中使用的HTTP方法的字符串表示。全大写表示。例如:

if request.method == 'GET':
    do_something()
elif request.method == 'POST':
    do_something_else()

GET


包含所有HTTP GET参数的类字典对象。参见QueryDict 文档。

POST


包含所有HTTP POST参数的类字典对象。参见QueryDict 文档。

服务器收到空的 POST请求的情况也是有可能发生的。也就是说,表单form通过HTTP POST方法提交请求,但是表单中可以没有数据。因此,不能使用语句if request.POST来判断是否使用HTTP POST方法;应该使用if request.method == "POST" (参见本表的method属性)。

注意: POST不包括file-upload信息。参见FILES属性。

REQUEST


为了方便,该属性是POST和GET属性的集合体,但是有特殊性,先查找POST属性,然后再查找GET属性。借鉴PHP’s $_REQUEST。

例如,如果GET = {"name": "john"} 和POST = {"age": '34'},则 REQUEST["name"] 的值是"john", REQUEST["age"]的值是"34".

强烈建议使用GET and POST,因为这两个属性更加显式化,写出的代码也更易理解。

COOKIES


包含所有cookies的标准Python字典对象。Keys和values都是字符串。参见第12章,有关于cookies更详细的讲解。

FILES


包含所有上传文件的类字典对象。FILES中的每个Key都是<input type="file" name="" />标签中name属性的值. FILES中的每个value 同时也是一个标准Python字典对象,包含下面三个Keys:

    filename: 上传文件名,用Python字符串表示
    content-type: 上传文件的Content type
    content: 上传文件的原始内容

注意:只有在请求方法是POST,并且请求页面中<form>有enctype="multipart/form-data"属性时FILES才拥有数据。否则,FILES 是一个空字典。

META


包含所有可用HTTP头部信息的字典。 例如:

    CONTENT_LENGTH
    CONTENT_TYPE
    QUERY_STRING: 未解析的原始查询字符串
    REMOTE_ADDR: 客户端IP地址
    REMOTE_HOST: 客户端主机名
    SERVER_NAME: 服务器主机名
    SERVER_PORT: 服务器端口

META 中这些头加上前缀HTTP_最为Key, 例如:

    HTTP_ACCEPT_ENCODING
    HTTP_ACCEPT_LANGUAGE
    HTTP_HOST: 客户发送的HTTP主机头信息
    HTTP_REFERER: referring页
    HTTP_USER_AGENT: 客户端的user-agent字符串
    HTTP_X_BENDER: X-Bender头信息

user


是一个 django.contrib.auth.models.User 对象,代表当前登录的用户。如果访问用户当前没有登录,user将被初始化为 django.contrib.auth.models.AnonymousUser的实例。你可以通过user的is_authenticated() 方法来辨别用户是否登录:

if request.user.is_authenticated():
    # Do something for logged-in users.
else:
    # Do something for anonymous users.

只有激活Django中的AuthenticationMiddleware时该属性才可用

关于认证和用户的更详细讲解,参见第12章。

session


唯一可读写的属性,代表当前会话的字典对象。只有激活Django中的session支持时该属性才可用。 参见第12章。

raw_post_data


原始HTTP POST数据,未解析过。 高级处理时会有用处。

Request对象也有一些有用的方法,见Table H-2:



Table H-2. HttpRequest Methods

Method


Description

__getitem__(key)


返回GET/POST的键值,先取POST,后取GET。如果键不存在抛出 KeyError。

这是我们可以使用字典语法访问HttpRequest对象。

例如,request["foo"]等同于先request.POST["foo"] 然后 request.GET["foo"]的操作。

has_key()


检查request.GET or request.POST中是否包含参数指定的Key。

get_full_path()


返回包含查询字符串的请求路径。例如, "/music/bands/the_beatles/?print=true"

is_secure()


如果请求是安全的,返回True,就是说,发出的是HTTPS请求。



QueryDict对象

在 HttpRequest对象中, GET和POST属性是django.http.QueryDict类的实例。 QueryDict类似字典的自定义类,用来处理单键对应多值的情况。因为一些HTML form元素,例如,<selectmultiple="multiple">, 就会传多个值给单个键。

QueryDict对象是immutable(不可更改的),除非创建它们的copy()。这意味着我们不能直接改变request.POST and request.GET的属性。

QueryDict实现所有标准的字典方法。还包括一些特有的方法,见Table H-3.



Table H-3. How QueryDicts Differ from Standard Dictionaries.

Method


Differences from Standard dict Implementation

__getitem__


和标准字典的处理有一点不同,就是,如果Key对应多个Value,__getitem__()返回最后一个value。

__setitem__


设置参数指定key的value列表(一个Python list)。注意:它只能在一个mutable QueryDict 对象上被调用(就是通过copy()产生的一个QueryDict对象的拷贝).

get()


如果key对应多个value,get()返回最后一个value。

update()


参数可以是QueryDict,也可以是标准字典。和标准字典的update方法不同,该方法添加字典 items,而不是替换它们:

>>> q = QueryDict('a=1')

>>> q = q.copy() # to make it mutable

>>> q.update({'a': '2'})

>>> q.getlist('a')

 ['1', '2']

>>> q['a'] # returns the last

['2']

items()


和标准字典的items()方法有一点不同,该方法使用单值逻辑的__getitem__():

>>> q = QueryDict('a=1&a=2&a=3')

>>> q.items()

[('a', '3')]

values()


和标准字典的values()方法有一点不同,该方法使用单值逻辑的__getitem__():



此外, QueryDict也有一些方法,见Table H-4.



H-4. 额外的 (非字典的) QueryDict 方法

Method


Description

copy()


返回对象的拷贝,内部实现是用Python标准库的copy.deepcopy()。该拷贝是mutable(可更改的) — 就是说,可以更改该拷贝的值。

getlist(key)


返回和参数key对应的所有值,作为一个Python list返回。如果key不存在,则返回空list。 It’s guaranteed to return a list of some sort..

setlist(key,list_)


设置key的值为list_ (unlike __setitem__()).

appendlist(key,item)


添加item到和key关联的内部list.

setlistdefault(key,list)


和setdefault有一点不同,它接受list而不是单个value作为参数。

lists()


和items()有一点不同, 它会返回key的所有值,作为一个list, 例如:

>>> q = QueryDict('a=1&a=2&a=3')

>>> q.lists()

[('a', ['1', '2', '3'])]

urlencode()


返回一个以查询字符串格式进行格式化后的字符串(e.g., "a=2&b=3&b=5").



A Complete Example

例如, 下面是一个HTML form:

<form action="/foo/bar/" method="post">
<input type="text" name="your_name" />
<select multiple="multiple" name="bands"> 
   <option value="beatles">The Beatles</option>
    <option value="who">The Who</option>
    <option value="zombies">The Zombies</option>
</select>
<input type="submit" />
</form>

如果用户在your_name域中输入"JohnSmith",同时在多选框中选择了“The Beatles”和“The Zombies”,下面是Django请求对象的内容:

>>> request.GET{}
>>> request.POST
{'your_name': ['John Smith'], 'bands': ['beatles', 'zombies']}
>>> request.POST['your_name']
'John Smith' 
>>> request.POST['bands']
'zombies'
>>> request.POST.getlist('bands')
['beatles', 'zombies']
>>> request.POST.get('your_name', 'Adrian')
'John Smith'
>>> request.POST.get('nonexistent_field', 'Nowhere Man')
'Nowhere Man'

HttpResponse

对于HttpRequest 对象来说,是由Django自动创建, 但是,HttpResponse对象就必须我们自己创建。每个View方法必须返回一个HttpResponse对象。

HttpResponse类在django.http.HttpResponse。

构造HttpResponses

一般地, 你可以通过给HttpResponse的构造函数传递字符串表示的页面内容来构造HttpResponse对象:

>>> response = HttpResponse("Here's the text of the Web page.")
>>> response = HttpResponse("Text only, please.", mimetype="text/plain")

但是如果想要增量添加内容, 你可以把response当作filelike对象使用:

>>> response = HttpResponse()
>>> response.write("<p>Here's the text of the Web page.</p>")
>>> response.write("<p>Here's another paragraph.</p>")

也可以给HttpResponse传递一个iterator作为参数,而不用传递硬编码字符串。 如果你使用这种技术, 下面是需要注意的一些事项:

·         iterator应该返回字符串.

·         如果HttpResponse使用iterator进行初始化,就不能把HttpResponse实例作为filelike 对象使用。这样做将会抛出异常。

最后,再说明一下,HttpResponse实现了write()方法, 可以在任何需要filelike对象的地方使用HttpResponse对象。参见第11章,有一些例子。

设置Headers

你可以使用字典语法添加,删除headers:

>>> response = HttpResponse() 
>>> response['X-DJANGO'] = "It's the best."
>>> del response['X-PHP']
>>> response['X-DJANGO']
"It's the best."

你也可以使用has_header(header)方法检测某个header是否存在。

不要手动设置Cookie headers;具体的做法,参见第12章,有关于怎样在Django中处理cookies的详细讲解。

HttpResponse子类

Django包含很多HttpResponse子类,用来处理不同的HTTP响应类型(见Table H-5). 和HttpResponse一样, 这些子类在django.http中.



Table H-5. HttpResponse Subclasses

Class


Description

HttpResponseRedirect


构造函数接受单个参数:重定向到的URL。可以是全URL (e.g., 'http://search.yahoo.com/')或者相对URL(e.g., '/search/'). 注意:这将返回HTTP状态码302。

HttpResponsePermanentRedirect


同HttpResponseRedirect一样,但是返回永久重定向(HTTP 状态码 301)。

HttpResponseNotModified


构造函数不需要参数。Use this to designate that a page hasn’t been modified since the user’s last request.

HttpResponseBadRequest


返回400 status code。

HttpResponseNotFound


返回404 status code.

HttpResponseForbidden


返回403 status code.

HttpResponseNotAllowed


返回405 status code. 它需要一个必须的参数:一个允许的方法的list (e.g., ['GET','POST']).

HttpResponseGone


返回410 status code.

HttpResponseServerError


返回500 status code.



当然,你也可以自己定义不包含在上表中的HttpResponse子类。

返回Errors

在Django中返回HTTP错误码是很容易的。上面介绍了HttpResponseNotFound, HttpResponseForbidden, HttpResponseServerError等一些子类。View方法中返回这些子类的实例就OK了,例如:

def my_view(request):    
    #  ...   
    if foo:       
         return HttpResponseNotFound('<h1>Page not found</h1>')    
    else:        
         return HttpResponse('<h1>Page was found</h1>')

当返回HttpResponseNotFound时,你需要定义错误页面的HTML:

return HttpResponseNotFound('<h1>Page not found</h1>')

因为404错误是最常使用的HTTP错误, 有一个更方便的方法处理它。

为了方便,而且整个站点有一致的404错误页面也是友好的,Django提供一个Http404异常类。如果在一个View方法中抛出Http404,Django将会捕获它并且返回标准错误页面,同时返回错误码404。

from django.http import Http404

def detail(request, poll_id):    
    try:        
        p = Poll.objects.get(pk=poll_id)    
    except Poll.DoesNotExist:       
         raise Http404    
    return render_to_response('polls/detail.html', {'poll': p})

为了使用Http404异常, 你需要创建一个模板文件。当异常抛出时,就会显示该模板文件。该模板文件的文件名是404.html,在模板根目录下创建。

自定义404 (Not Found) View方法

当抛出Http404异常时, Django会加载一个特殊的view方法处理404错误。默认地, 它是django.views.defaults.page_not_found,负责加载和渲染404.html模板文件。

这意味着我们必须在模板根目录定义404.html模板文件,该模板文件应用于所有的404异常。

该page_not_found view方法应该可以应对几乎99%的Web App,但是如果想要重载该view方法时, 你可以在URLConf文件中指定handler404为自定义的404 errpr view方法, 像这样:

from django.conf.urls.defaults import *

urlpatterns = patterns('',    
    ...
)

handler404 = 'mysite.views.my_custom_404_view'

Django就是通过在URLConf文件中查找handler404来决定404 view方法的。默认地, URLconfs包含下面一行代码:

from django.conf.urls.defaults import *

在 django/conf/urls/defaults.py模块中, handler404赋值为 'django.views.defaults.page_not_found'。

注意:

·         如果请求URL没有和Django的URLConf文件中的任何一个正则表示式匹配,404 view方法就会被调用。

·         如果没有定义自己的404 view — 使用默认地404 view,你仍然有一个工作要做:在模板根目录创建404.html模板文件。默认地404 view将使用该模板处理所有404错误。

·         如果 DEBUG设置为True (在setting模块中),404 view方法不会被使用,取而代之的是,traceback信息。

自定义500 (Server Error) View方法

同样地,当view代码发生运行时错误时,Django也会产生特殊行为。如果view方法产生异常,Django将会调用默认地view方法django.views.defaults.server_error, 该方法加载渲染500.html模板文件。

这意味着我们必须在模板根目录定义500.html模板文件,该模板文件应用于所有的服务器错误。

该server_error view方法应该可以应对几乎99%的Web App,但是如果想要重载该view方法时, 你可以在URLConf文件中指定handler500为自定义的server error view方法, 像这样:

from django.conf.urls.defaults import *

   urlpatterns = patterns('',    

        ...

   )



   handler500 = 'mysite.views.my_custom_error_view'

* Django中的request.GET和request.POST *



Django的views.py中定义的函数的requst参数,可以读request.method确定是POST还是GET

首先,request.GET 和 request.POST是两个对象,类字典对象,提供和字典类似的接口,也有一些别的接口。

什么是POST和GET,这与HTTP协议有关:

参考这篇博客:http://blog.csdn.NET/gideal_wang/article/details/4316691

这篇博客介绍了两者从原理上和表现形式上的区别,非常清晰,如有需要可阅读原文,下面是一点小结和摘录:

1、POST和GET是HTTP协议定义的与服务器交互的方法。GET一般用于获取/查询 资源信息,而POST一般用于更新 资源信息。还有另两种方法是PUT和DELETE

2、POST和GET都可以与服务器交互完成查、改、增、删的操作。

3、

(1GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,多个参数用&连接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。(一个简单的url例子:http://127.0.0.1:8000/search/?q=Django 只有一个参数 所以没用&)如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

  POST提交:把提交的数据放置在是HTTP包的包体中。上文示例中红色字体标明的就是实际的传输数据

     因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变

    (2)传输数据的大小:首先声明:HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。

而在实际开发中存在的限制主要有:

GET:特定浏览器和服务器对URL长度有限制,例如IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。

因此对于GET提交时,传输数据就会受到URL长度的限制。

POST:由于不是通过URL传值,理论上数据不受限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。

4、对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。


在Django Book中提到:

POST数据是来自HTML中的〈form〉标签提交的,而GET数据可能来自〈form〉提交也可能是URL中的查询字符串(the query string)。

Django Book第七章给出的代码例子中,views.py的处理函数开始会验证request.method是否为POST:

确认request.method的值是’POST’。用户浏览表单时这个值并不存在,当且仅当表单被提交时这个值才出现。 (在后面的例子中,request.method将会设置为’GET’,因为在普通的网页浏览中,浏览器都使用GET,而非POST)。判断request.method的值很好地帮助我们将表单显示与表单处理隔离开来。

如果在视图里通过POST获取数据,那么request.GET将为空。

使用request.POST.get()方法 可以获取表单指定键的值内容  并可以在获取表单内容的同时提供一个默认值防止该键对应的值为空



在Django中 request.POST常常和form对象一起用,用来初始化一个form  如下面所示 先判断方法是否为POST 然后用request.POST对已有的Form对象ContactForm进行初始化。request.POST本身也是类字典对象,所以可以用于Form的初始化。

[python] view plain copy

    if request.method == 'POST':  
        form = ContactForm(request.POST)  




附上一点摘记:

8)接受request的数据 
从post中取得数据,如果不存在则默认值为1 
pageNumber = request.POST.get('pageNumber',1) 
从get中取得数据,如果不存在则默认值为1 
pageNumber = request.GET.get('pageNumber',1) 
从所有请求中取得数据,如果不存在则默认值为1 
pageNumber = request.REQUEST.get('pageNumber',1) 
判断一个请求是post还是get方式 
if request.method == 'GET': 
对于request的操作可以参考 


http://www.woodpecker.org.cn/obp/django/django-faq/request_response.html


对于GET和POST提供的方法可以参考


http://djangobook.py3k.cn/appendixH/

* HTML中几种为绑定点击事件的方式比较 *

HTML中为button绑定事件的方式有三种。

例如以下标签:

<button type="submit" id="btn_submit"> submit </button>

一、使用jQuery进行绑定

$('#btn_submit').click(function(){

});


二、使用原声js绑定

document.getElementById("#btn_submit").addEventListener(‘click’, function(){

}, false);


三、直接在button标签中使用onclick绑定

<button type="submit" id="btn_submit" onclick="btnAction()"> submit </button>

然后在<script>标签中定义btnAtion的方法

<script>
        function btnAction()
        { }

</script>

js 限制input只能输入数字

<input type="text" onKeyUp="this.value=this.value.replace(/[^\.\d]/g,'');if(this.value.split('.').length>2){this.value=this.value.split('.')[0]+'.'+this.value.split('.')[1]}">

1.文本框只能输入数字代码(小数点也不能输入)
<input ōnkeyup="this.value=this.value.replace(/\D/g,'''')" ōnafterpaste="this.value=this.value.replace(/\D/g,'''')">

2.只能输入数字,能输小数点.
<input ōnkeyup="if(isNaN(value))execCommand(''undo'')" ōnafterpaste="if(isNaN(value))execCommand(''undo'')">
<input name=txt1 ōnchange="if(/\D/.test(this.value)){alert(''只能输入数字'');this.value='''';}">

3.数字和小数点方法二
<input type=text t_value="" o_value="" ōnkeypress="if(!this.value.match(/^[\+\-]?\d*?\.?\d*?$/))this.value=this.t_value;else this.t_value=this.value;if(this.value.match(/^(?:[\+\-]?\d+(?:\.\d+)?)?$/))this.o_value=this.value" ōnkeyup="if(!this.value.match(/^[\+\-]?\d*?\.?\d*?$/))this.value=this.t_value;else this.t_value=this.value;if(this.value.match(/^(?:[\+\-]?\d+(?:\.\d+)?)?$/))this.o_value=this.value" ōnblur="if(!this.value.match(/^(?:[\+\-]?\d+(?:\.\d+)?|\.\d*?)?$/))this.value=this.o_value;else{if(this.value.match(/^\.\d+$/))this.value=0+this.value;if(this.value.match(/^\.$/))this.value=0;this.o_value=this.value}">

4.只能输入字母和汉字
<input ōnkeyup="value=value.replace(/[\d]/g,'''') "onbeforepaste="clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[\d]/g,''''))" maxlength=10 name="Numbers">

5.只能输入英文字母和数字,不能输入中文
<input ōnkeyup="value=value.replace(/[^\w\.\/]/ig,'''')">

6.只能输入数字和英文<font color="Red">chun</font>
<input ōnKeyUp="value=value.replace(/[^\d|chun]/g,'''')">

7.小数点后只能有最多两位(数字,中文都可输入),不能输入字母和运算符号:
<input ōnKeyPress="if((event.keyCode<48 || event.keyCode>57) && event.keyCode!=46 || /\.\d\d$/.test(value))event.returnValue=false">

8.小数点后只能有最多两位(数字,字母,中文都可输入),可以输入运算符号:
<input ōnkeyup="this.value=this.value.replace(/^(\-)*(\d+)\.(\d\d).*$/,''$1$2.$3'')">

python字符串连接的N种方式总结

第一种,想必只要是有编程经验的人,估计都知道,直接用 “+” 来连接两个字符串:

'Jim' + 'Green' = 'JimGreen'

第二种比较特殊,如果两个字符串用“逗号”隔开,那么这两个字符串将被连接,但是,字符串之间会多出一个空格:

'Jim', 'Green' = 'Jim Green'

第三种也是 python 独有的,只要把两个字符串放在一起,中间有空白或者没有空白:两个字符串自动连接为一个字符串:

'Jim''Green' = 'JimGreen'
'Jim' 'Green' = 'JimGreen'

第四种功能比较强大,借鉴了C语言中 printf 函数的功能,如果你有C语言基础,看下文档就知道了。这种方式用符号“%”连接一个字符串和一组变量,字符串中的特殊标记会被自动用右边变量组中的变量替换:

'%s, %s' % ('Jim', 'Green') = 'Jim, Green'

第五种就属于技巧了,利用字符串的函数 join 。这个函数接受一个列表,然后用字符串依次连接列表中每一个元素:

var_list = ['tom', 'david', 'john']
a = '###'
a.join(var_list) = 'tom###david###john'

其实,python 中还有一种字符串连接方式,不过用的不多,就是字符串乘法,如:

a = 'abc'
a * 3 = 'abcabcabc'

点击按钮实现单词首字母变大写

<SCRIPT LANGUAGE="JavaScript">
<!-- Begin
function changeCase(frmObj) {
var index;
var tmpStr;
var tmpChar;
var preString;
var postString;
var strlen;
tmpStr = frmObj.value.toLowerCase();
strLen = tmpStr.length;
if (strLen > 0)  {
for (index = 0; index < strLen; index++)  {
if (index == 0)  {
tmpChar = tmpStr.substring(0,1).toUpperCase();
postString = tmpStr.substring(1,strLen);
tmpStr = tmpChar + postString;
}
else {
tmpChar = tmpStr.substring(index, index+1);
if (tmpChar == " " && index < (strLen-1))  {
tmpChar = tmpStr.substring(index+1, index+2).toUpperCase();
preString = tmpStr.substring(0, index+1);
postString = tmpStr.substring(index+2,strLen);
tmpStr = preString + tmpChar + postString;
         }
      }
   }
}
frmObj.value = tmpStr;
}
//  End -->
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值