views.py文件详解

一、http请求中产生的两个核心对象

http请求:HttpRequest
http响应: HttpResponse

所在位置: django.http

1、HttpRequest:
HttpRequest对象属性

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

1.2 method
请求中使用的HTTP方法的字符串表示,全大写表示。例如:
if request.method == 'GET':
       do_something()
elif request.method =='POST':
      do_something_else()

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

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

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

POST提交和GET提交最大区别:
POST提交内容不会显示在浏览器上,即不以URL形式显示在浏览器的地址栏上,GET提交则会完整的显示在浏览器的地址栏上

1.5 REQUEST
为了方便,该属性市POST和GET属性的集合,但是有特殊性,先查找POST属性,然后再查找GET属性。借鉴PHP's $_REQUEST.
例如,如果GET = {"name":"john"}和POST = {"age":'60'},则REQUEST["name"]的值是"john",REQUEST["age"]的值是"34"
强烈建议使用GET和POST,因为这两个属性更加显示化,写出代码更容易了解。截止到django1.8,REQUEST方法已经废弃了,Django1.9中已经不彻底抛弃了该方法

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

1.7 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时一个空字典


1.8 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头信息

1.9 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时,该属性才可用


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

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

Httprequest对象的方法(部分)

1.12 get_full_path()

返回包含查询字符串的请求路径。例如:
"/music/bands/the_beatles/?pring=true"
这里要跟get_path方法区分开来,这里路径包含参数,get_path方法返回来不包含参数仅仅是省略域名的url路径

QueryDict对象(部分)

1.13 get()

如果key对应多个value,get()返回最后一个value
在HttpRequest对象中,GET和POST属性时django.http.QueryDict类的实例

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

HttpResponse类在django.http.HttpResponse中


构造HttpRespouse:
>>> response = HttpResponse("Here's the text of the Web page.")
>>> response = HttpResponse("Text only,please.",{"mimetype":"text/plain"})

更详细的有关request和response对象的介绍
https://docs.djangoproject.com/en/1.9/ref/request-response/

二、在HttpRespouse对象上扩展的常用方法 render、render_to_response、redirect

response方法:
from django.template import loader
from django.http import HttpRequest,HttpResponse

def hello(request,a):
      print(request.get_full_path())
      user_list = User.objects.all()
      t = loader.get_template('table.html')
      c={'user_list':user_list}
      return HttpResponse(t.render(c,request),content_type="text/html") #返回一个response对象,里面又通过模板对象中的render方法来实现渲染

render方法
就是将上述response中的t、c等定义代码简化为一句代码:

def hello(request,a):
       print(request.get_full_path())
       user_list = User.objects.all()
       return render(request,'table.html',{'user_list':user_list})

render_to_response方法:相对于render方法少传递一个request对象

from django.shortcuts import render,render_to_response

def hello(request,a):
      print(request.get_full_path())
      user_list = User.objects.all()
      return render_to_response('table.html',{'user_list':user_list})

redirect方法
该方法是作为跳转使用,比如上述代码后面跳转到百度:
from django.shortcuts import redirect

def hello(request,a):
      print(request.get_full_path())
      user_list = User.objects.all()
      return redirect("http://www.baidu.com")

更多详见:
https://docs.djangoproject.com/en/1.9/topics/http/shortcuts/


三、其他常用方法
locals():可以直接将函数中所有的变量全部传递给模板,不管是我们自己定义的还是系统定义的变量都会一起传递过去,不用我们自己再去拼接字典,从而达到一个简化的目的

实例代码:

def hello(request,a):
      print(request.get_full_path())
      user_list = User.objects.all()
      print(locals())
      return render_to_response('table.html',locals())

输出结果变量:
/hello/
{'a': '123', 'user_list': [<User: admin>, <User: test>], 'request': <WSGIRequest: GET '/hello/'>}

原文地址:https://www.cnblogs.com/kindnull/p/8379766.html