HttpRequest----request


常用的

request.path除域名以外的请求路径,以正斜杠开头"/hello/"request.get_host()主机名(比如,通常所说的域名)"127.0.0.1:8000"or"www.example.com"request.get_full_path()请求路径,可能包含查询字符串"/hello/?print=true"request.is_secure()如果通过HTTPS访问,则此方法返回True, 否则返回False
request.META是一个Python字典,包含了所有本次HTTP请求的Header信息很多东西
HTTP_REFERER进站前链接网页HTTP_USER_AGENT

"Mozilla/5.0(X11;U;Linuxi686;fr-FR;

rv:1.8.1.17)Gecko/20080829Firefox/2.0.0.17"

REMOTE_ADDR"12.345.67.89,23.456.78.90"request.GET类字典对象,POST数据是来自HTML中的〈form〉标签提交的request.POST类字典对象,GET数据可能来自〈form〉提交也可能是URL中的查询字符串(例如/search/?q=django)


三种常见返回

fromdjango.httpimportHttpResponsedefhello(request):returnHttpResponse("Helloworld")fromdjango.shortcutsimportrender_to_responsedefsearch_form(request):returnrender_to_response('search_form.html')fromdjango.httpimportHttpResponseRedirectreturnHttpResponseRedirect('/contact/thanks/')




典型的数据交互


一个get例子

defsearch(request):errors=[]#收集错误信息交给前端(简单处理后显示)if'q'inrequest.GET:q=request.GET['q']ifnotq:errors.append('Enterasearchterm.')eliflen(q)>20:errors.append('Pleaseenteratmost20characters.')else:books=Book.objects.filter(title__icontains=q)#数据库的操作见icontains(大小写无关的LIKE)returnrender_to_response('search_results.html',{'books':books,'query':q})returnrender_to_response('search_form.html',{'errors':errors})#若用户刷新一个包含POST表单的页面,那么请求将会重新发送造成重复。重定向喽

#search_form.html<html><head><title>Search</title></head><body>{%iferrors%}#显示错误<p><p>会更漂亮点<ul>{%forerrorinerrors%}<li>{{error}}</li>{%endfor%}</ul>{%endif%}<formaction="/search/"method="get"><inputtype="text"name="q">#后端通过q拿值<inputtype="submit"value="Search"></form></body></html>

#search_results.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body><p>Yousearchedfor:<strong>{{query}}</strong></p>{%ifbooks%}<p>Found{{books|length}}book{{books|pluralize}}.</p>#模板的过滤器length返回变量的长度pluralize单词的复数形式,如列表字符串个数大于1,返回s,否则返回空串<ul>{%forbookinbooks%}<li>{{book.title}}</li>{%endfor%}</ul>{%else%}<p>Nobooksmatchedyoursearchcriteria.</p>{%endif%}</body></html>


一个post的例子

#views.pyfromdjango.core.mailimportsend_mailfromdjango.httpimportHttpResponseRedirectfromdjango.shortcutsimportrender_to_responsedefcontact(request):errors=[]ifrequest.method=='POST':ifnotrequest.POST.get('subject',''):errors.append('Enterasubject.')ifnotrequest.POST.get('message',''):errors.append('Enteramessage.')ifrequest.POST.get('email')and'@'notinrequest.POST['email']:errors.append('Enteravalide-mailaddress.')ifnoterrors:send_mail(#四个必选参数:主题,正文,寄信人和收件人列表。request.POST['subject'],request.POST['message'],request.POST.get('email','noreply@example.com'),['siteowner@example.com'],)returnHttpResponseRedirect('/contact/thanks/')#若用户刷新一个包含POST表单的页面,那么请求将会重新发送造成重复。#所以重定向,应每次都给成功的POST请求做重定向。returnrender(request,'contact_form.html',{'errors':errors,'subject':request.POST.get('subject',''),'message':request.POST.get('message',''),'email':request.POST.get('email',''),})#验证失败后,返回客户端的表单中各字段最好是填有原来提交的数据#contact_form.html<html><head><title>Contactus</title></head><body><h2>Contactus</h2>{%iferrors%}<ul>{%forerrorinerrors%}<li>{{error}}</li>{%endfor%}</ul>{%endif%}<formaction="/contact/"method="post"><p>Subject:<inputtype="text"name="subject"value="{{subject}}"></p><p>Youre-mail(optional):<inputtype="text"name="email"value="{{email}}"></p><p>Message:<textareaname="message"rows="10"cols="50">{{message}}</textarea></p><inputtype="submit"value="Submit"></form></body></html>













详解form表单


有点类似模型,定义各个字段的类型

fromdjangoimportformsclassContactForm(forms.Form):subject=forms.CharField()email=forms.EmailField(required=False)message=forms.CharField()




form将数据格式化成html的形式

>>>fromcontact.formsimportContactForm>>>f=ContactForm()>>>printf<tr><th><labelfor="id_subject">Subject:</label></th><td><inputtype="text"name="subject"id="id_subject"/></td></tr><tr><th><labelfor="id_email">Email:</label></th><td><inputtype="text"name="email"id="id_email"/></td></tr><tr><th><labelfor="id_message">Message:</label></th><td><inputtype="text"name="message"id="id_message"/></td></tr>

默认是tr th 可以换成下面两种形式

>>>printf.as_ul()<li><labelfor="id_subject">Subject:</label><inputtype="text"name="subject"id="id_subject"/></li>>>>printf.as_p()<p><labelfor="id_subject">Subject:</label><inputtype="text"name="subject"id="id_subject"/></p>




对每个字段取值

>>>printf['subject']<inputtype="text"name="subject"id="id_subject"/>>>>printf['message']<inputtype="text"name="message"id="id_message"/>



创建时赋值(字典形式)

>>>f=ContactForm({'subject':'Hello','email':'adrian@example.com','message':'Nicesite!'})



判断

>>>f.is_bound一旦你对一个Form实体赋值,你就得到了一个绑定formTrue>>>f.is_valid()判断是否合法,默认都是必需填参数True



errors

每一个邦定Form实体都有一个errors属性,它为你提供了一个字段与错误消息相映射的字典表。

>>>f=ContactForm({'subject':'Hello','message':''})>>>f.errors#不合法的赋值的字段,会成为字典里的items{'message':[u'Thisfieldisrequired.']}>>>f['subject'].errors[]




清理数据

>>>f=ContactForm({subject':Hello,email:adrian@example.com,message:Nicesite!})>>>f.is_valid()#如果一个Form实体的数据是合法的,它就会有一个可用的cleaned_data属性。True>>>f.cleaned_data#这是一个包含干净的提交数据的字典。{message':uNicesite!,email:uadrian@example.com,subject:uHello}