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请求前后打印

 

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

  方法一:  

   

 

   方法二: 

  

 

posted @ 2020-11-23 21:29  死里学  阅读(65)  评论(0)    收藏  举报