Django基础(4)_视图层
视图层
一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应。为了将代码放在某处,约定是将视图放置在项目或应用程序目录中的名为views.py的文件中。
视图层,熟练掌握两个对象即可:请求对象(request)和响应对象(HttpResponse):
HttpRequest对象
request属性
django将请求报文中的请求行, 首部信息, 内容主体封装成HttpRequest类中的属性
1. HttpRequest.GET
一个类似于字典的对象,包含 HTTP GET 的所有参数。GET QueryDict 响应头的内容(url后的参数)
获取一个值request.GET.get("name") # 参数同名时返回最后一个
获取多个值request .GET.getlist("name") # 返回值为list
2. HttpRequest.POST
一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。POST QueryDict 响应体里的内容。
注意:键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:
request.POST.getlist("hobby")
3. HttpRequest.body
原生请求体的内容:一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。
但是,如果要处理表单数据的时候,推荐还是使用 HttpRequest.POST 。
4. HttpRequest.path
返回当前请求的路径(url)(不含域名)
例:"/music/bands/the_beatles/"
5. HttpRequest.method
返回当前请求的请求方式:一个字符串,表示请求使用的HTTP 方法。必须使用大写。
例如:“GET”、“POST”
request常用方法
1. HttpRequest.get_full_path() 获取当前请求的完整路径(包含参数,不包含锚点) 例如:"/music/bands/the_beatles/?print=true" 2. HttpRequest.is_ajax() 如果请求是通过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是否是字符串’XMLHttpRequest’。 判断当前请求是否是ajax请求.返回值为布尔值
修改响应信息
def index(request):
re = HttpResponse('xxx')
# re = redirect('/home/')
re['name'] = 'gaoxiao' # 添加响应头键值对
# re.status_code = 404 # 修改状态码
return re
当我们访问inde时查看响应的信息

HTTPResponse对象(响应三剑客)
响应对象主要有三种形式 (响应三剑客):
HttpResponse()
render()
redirect()
- HTTPResponse(默认状态码200)
直接返回字符串,响应体里面的内容
- render(默认状态码200)
render(request, template_name[, context])
结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象(模板文件)
第一个参数 request
第二个参数 模板文件(login.html)
第三个参数(可选) 模板需要渲染的值.
如图:


- redirect (默认状态码302)
状态码描述:
301: 永久重定向
302: 代表临时重定向
1 def my_view(request): 2 ... 3 return redirect('/some/url/')
也可以是一个完整的url
def my_view(request): ... return redirect('http://example.com/')
CBV和FBV
FBV(function base views) 就是在视图里使用函数处理请求。
之前都是FBV模式写的代码,所以就不写例子了。
CBV(class base views) 就是在视图里使用类处理请求。
CBV的使用
urls.py文件的写法
urlpatterns = [
...
url(r'^book/', views.BookView.as_view()),
]
views.py中的写法
from django.views import View
class BookView(View):
# 通过反射获取到请求方法对应的类中的方法来执行
def get(self,request):
return HttpResponse('ok')
# 需要处理什么请求方法,就写对应名称的方法
原码部分
def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn't exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn't on the approved list.
if request.method.lower() in self.http_method_names: #get
# ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs) # HttpResponse('ok')
CBV模式urls参数
urls.py
url(r'^articles/(\d+)/', views.ArticalView.as_view()),
views.py
class ArticalView(View):
# 和FBV模式相同,有名分组是关键字传参,无名分组是位置传参
def get(self,request, year):
print(year)
return HttpResponse('articals')
dispatch方法的使用和装饰器的使用
这里我们想在请求get和post方法的前后打印一下东西
首先look一下模板文件

方法一 :
改写dispatch方法
1 """ 2 方法一: 改写dispatch方法, 但是若只想在get请求前后打印点东西却不能实现 3 """ 4 class TimeView(View): 5 def dispatch(self, request, *args, **kwargs): 6 print('aaa') 7 ret = super(TimeView, self).dispatch(request, *args, **kwargs) 8 print('bbb') 9 return ret 10 11 def get(self, request, year): 12 print(year) 13 return render(request, 'test.html') 14 15 def post(self, request, year): 16 print(request.POST) 17 return HttpResponse('ok')
访我们亲爱的网址:

点击提交 可以看到我们想要的效果实现了

方法二:
使用装饰器:
1 """ 2 方法二: 使用装饰器只在get请求前后打印点东西 3 """ 4 5 # 首先定义一个装饰器 6 def func(f): 7 def inner(*args, **kwargs): 8 print('aaa') 9 ret = f(*args, **kwargs) 10 print('bbb') 11 return ret 12 return inner 13 14 # 重点: django中的处理类中装饰器的方法 15 16 from django.utils.decorators import method_decorator 17 18 class TimeView(View): 19 20 @method_decorator(func) 21 def get(self, request, year): 22 print(year) 23 return render(request, 'test.html') 24 25 def post(self, request, year): 26 print(request.POST) 27 return HttpResponse('ok')
下面直接看结果:
并没有在post请求前后打印

另外再说两种装饰器添加的方法
方法一:

方法二:

本文来自博客园,作者:长情不羁的五年,转载请注明原文链接:https://www.cnblogs.com/grlend/articles/14027218.html

浙公网安备 33010602011771号