Django之视图
一 视图简介
视图,又称视图函数或者视图类。它接受Web请求并且返回Web响应。请求封装到视图函数的参数中,一般该参数写成request。响应方式有render、redirect和HttpResponse。任何视图函数最终都要返回一个响应。
二 视图写法
视图写法有两种:基于函数的处理请求方式和基于类的处理请求方式。
1.视图函数(FBV)
from django.http import HttpResponse def home(request): return HttpResponse('OK') #在urls.py里写法: url(r'^home/', views.home),
2.视图类(CBV)
(1)写法
from django.http import HttpResponse from django.views import View class MyView(View): def get(self, request): return HttpResponse('OK') def post(self,request): pass return HttpResponse('OK')
相应的,在urls.py里要修改如下:
from django.conf.urls import url from myapp.views import MyView #引入我们在views.py里面创建的类
urlpatterns = [
url(r'^index/$', MyView.as_view()),
]
(2)注意:
视图类里必须有get和post函数(名字必须叫get和post),一个用来处理get请求,一个用来处理post请求。
url(r'^login2/', views.LoginView.as_view())的views.LoginView.as_view()实质在执行views.view。看as_view源码可知,as_view返回的是view,而view返回的是个dispatch()函数。
dispath()是个反射。因此只有类里面的函数名是get和post,才能找到相应的请求方法。在视图函数里,就要if判断request.method是GET还是POST,再进行相应的逻辑处理。
三 给视图加装饰器
1.FBV加装饰器
给函数加装饰器,直接在函数上一行加语法糖:@装饰器名
def wrapper(func): def inner(*args, **kwargs): ret = func(*args, **kwargs) return ret return inner
# FBV版
@wrapper def func(request): pass return render(request, "xx.html")
2.CBV加装饰器
Django中提供了method_decorator装饰器用于将函数装饰器转换为方法装饰器。
from django.utils.decorators import method_decorator @method_decorator(wrapper) def get(self,request): # print("get方法执行了") return render(request,'login2.html')
四 request和response对象
1.request
当一个页面被请求时,Django就会创建一个包含本次请求原信息(请求报文中的请求行、首部信息、内容主体等)的HttpRequest对象。视图函数的参数承接这个对象,一般这个参数写成request。
请求相关的常用值
path_info 返回用户访问url,不包括域名
method 请求中使用的HTTP方法的字符串表示,全大写表示。
GET 包含所有HTTP GET参数的类字典对象
POST 包含所有HTTP POST参数的类字典对象
body 请求体,byte类型 request.POST的数据就是从body里面提取到的
2.response
我们写的每个视图都需要实例化,填充和返回一个HttpResponse。
响应对象主要有三种形式
HttpResponse()
render()
redirect()
HttpResponse()括号里直接跟个字符串。
render()结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
参数:
request: 用于生成响应的请求对象。 template_name:要使用的模板的完整名称,可选的参数 context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。 content_type:生成的文档要使用的MIME类型。默认为 DEFAULT_CONTENT_TYPE 设置的值。默认为'text/html' status:响应的状态码。默认为200。 useing: 用于加载模板的模板引擎的名称。 redirect() :给浏览器了一个30x的状态码。进行重定向。 临时重定向(响应状态码:302)和永久重定向(响应状态码:301)