2-5.视图层

Django的View(视图)

视图函数

视图函数,简称视图,属于Django的视图层,默认定义在views.py文件中,是用来处理web请求信息以及返 回响应信息的函数

image-20211203194834081

请求对象

当一个页面被请求时,django会创建一个包含本次请求原信息(如http协议请求报文中的请求行、首部信 息、内容主体)的HttpRequest对象。 之后,django会找到匹配的视图,将该对象传给视图函数的第一个参数,约定俗称该参数名为request(类 似于我们自定义框架的environ参数)。 在视图函数中,通过访问该对象的属性便可以提取http协议的请求数据

HttpRequest对象常用属性

HttpRequest.method	获取请求使用的方法

HttpRequest.GET		值为一个类似于字典的QueryDict对象封装了GET请求的所有参数

HttpRequest.POST	 值为一个类似于字典的QueryDict对象,封装了POST请求所包含的表单数据

HttpRequest.path	 获取url地址的路径部分,只包含路径部分

HttpRequest.get_full_path()		获取url地址的完整path,既包含路径又包含参数部分

 HttpRequest.scheme  	 	表示请求方案的字符串(通常为http或https)
 
 HttpRequest.encoding  		 表示提交的数据的编码方式

image-20211203194856396

一.HttpRequest.method
  获取请求使用的方法(值为纯大写的字符串格式)。例如:"GET"、"POST"
   应该通过该属性的值来判断请求方法
 
   在视图函数中:
   if request.method. == "GET":
       ...
   if request.method == "POST":
       ...
 
二.HttpRequest.GET
  值为一个类似于字典的QueryDict对象,封装了GET请求的所有参数,可通过HttpRequest.GET.get('键')获取相对应的值
 
   在视图函数中:
   request.GET.get('name')
 
三.HttpRequest.POST
   值为一个类似于字典的QueryDict对象,封装了POST请求所包含的表单数据,可通过HttpRequest.POST.get('键')获取相对应的值
 
   在视图函数中:
   request.POST.get('name')
 
   针对表单中checkbox类型的input标签、select标签提交的数据,键对应的值为多个,需要用:HttpRequest.POST.getlist("hobbies")获取存有多个值的列表,同理也有HttpRequest.GET.getlist("键")
   针对有多个值的的情况,也可以用HttpRequest.GET.get("键"),默认会获取列表中的最后一个值
   


HttpRequest.body    
    当浏览器基于http协议的POST方法提交数据时,数据会被放到请求体中发送给django,
django会将接收到的请求体数据存放于HttpRequest.body属性中,因为该属性的值为Bytes类型,
所以通常情况下直接处理Bytes、并从中提取有用数据的操作是复杂而繁琐的,好在django会对它
做进一步的处理与封装以便我们更为方便地提取数据


HttpRequest.encoding
  一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')。
   这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。
   接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的 encoding 值。
   如果你知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。
 
    
 HttpRequest.scheme
 表示请求方案的字符串(通常为http或https)
案例:
urls.py
from django.urls import re_path
from app01 import views
 
urlpatterns = [
    re_path(r'^login/$',views.login),
]
Views.py
from django.shortcuts import render,HttpResponse
 
def login(request):
    if request.method == 'GET':
        # 当请求url为:http://127.0.0.1:8001/login/?a=1&b=2&c=3&c=4&c=5
        # 请求方法是GET,?后的请求参数都存放于request.GET中
        print(request.GET)
        # 输出<QueryDict: {'a': ['1'], 'b': ['2'], 'c': ['3', '4', '5']}>
 
        # 获取?后参数的方式为
        a=request.GET.get('a') # 1
        b=request.GET.get('b') # 2
        c=request.GET.getlist('c') # ['3', '4', '5']
        c1=request.GET.get('c') # 5
 
        return render(request,'login.html')
    elif request.method == 'POST':
        # 在输入框内输入用户名egon、年龄18,选择爱好,点击提交
        # 请求方法为POST,表单内的数据都会存放于request.POST中
        print(request.POST) 
        # 输出<QueryDict: {..., 'name': ['egon'], 'age': ['18'], 'hobbies': ['music', 'read']}>
 
        # 获取表单中数据的方式为
        name=request.POST.get('name') # egon
        age=request.POST.get('age') # 18
        hobbies=request.POST.getlist('hobbies') # ['music', 'read']
 
        return HttpResponse('提交成功')
在templates目录下新建login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
 
<!--
method="post"代表在提交表单时会以POST方法提交表单数据
action="/login/" 代表表单数据的提交地址为http://127.0.0.1:8001/login/,可以简写为action="/login/",或者action=""
-->
<form action="http://127.0.0.1:8001/login/" method="post">
    {% csrf_token %} <!--强调:必须加上这一行,后续我们会详细介绍-->
    <p>用户名:<input type="text" name="name"></p>
    <p>年龄:<input type="text" name="age"></p>
    <p>
        爱好:
        <input type="checkbox" name="hobbies" value="music">音乐
        <input type="checkbox" name="hobbies" value="read">阅读
        <input type="checkbox" name="hobbies" value="dancing">跳舞
    </p>
    <p><input type="submit" value="提交"></p>
 
</form>
</body>
</html>

image-20211203194917015

响应对象

请求对象HttpRequest是由django为我们创建好的,直接使用即可,而响应对象则需要我们负责创建。我们 编写的每个视图都应该返回一个HttpResponse对象,响应可以是一个网页的HTML内容,一个重定向,一 个404错误,一个XML文档,或者一张图片

from django.shortcuts import render
from django.shortcuts import redirect
from django.shortcuts import HttpResponse

from django.http import JsonResponse

render

image-20211203194031006

参数:
 1、request:用于生成响应的请求对象,固定必须传入的第一个参数
 2、template_name:要使用的模板的完整名称,必须传入,render默认会去templates目录下查找模板文件
 3、context:可选参数,可以传入一个字典用来替换模块文件中的变量,默认是一个空字典。如果字典中的某个值是
可调用的,视图将在渲染模板之前调用它。
 4、content_type:生成的文档要使用的MIME类型。默认为 DEFAULT_CONTENT_TYPE 设置的值。默认为'text/htm
l'
 5、status:响应的状态码。默认为200。
 6、using: 用于加载模板的模板引擎的名称。
 
 

render的功能可以总结为:根据给定字典渲染模板文件,并返回一个渲染后的HttpResponse对象。

redirect

image-20211203194130771

返回重定向对象,返回的状态码为302,第一个参数用来指定浏览器重定向的地址

参数
1、一个完全标准的URL地址,如'https://www.yahoo.com/search/'
2、也可以是一个没有域名的绝对路径,如'/search/'
3、或者是一个没有域名的相对路径,如'search/',与1、2直接跳转到指定的绝对路径不同,相对路径需要先与当前路径
进行拼后才能跳转,例如:如果当前路径为http://127.0.0.1:8080/index/,拼接后的路径为http://127.0.0.1:808
0/index/search/

HttpResponse

​ HttpResponse('hello django!')
​ 暂且理解为可以返回给前端浏览器文本类的数据

JsonResponse

向前端返回json格式的字符串

两种方式

方式一

import json
def my_view(request):
	data=['kevin','tony']
	return HttpResponse(json.dups(data))
	

方式二

from django.http import JsonResponse
def  my_view(request):
	data=['tony','kevin']
    return JsonResponse(data,safe=False)
#默认safe=True代表只能序列化字典对象,safe=False代表可以序列化字典以外的对象 

FBV与CBV

FBV	基于函数的视图
	def index(request):
        return HttpResponse(...)
    
CBV 基于类的视图
# 视图函数即可以是函数也可以是类
	from django.views import View
    class MyLogin(View):
        def get(self, request):
            return HttpResponse('get请求')
        def post(self, request):
            return HttpResponse('post请求')
    url(r'^login/', views.MyLogin.as_view())
    """CBV会自动判断当前请求方法并自动匹配类中的方法执行"""

FBV路由配置

urls.py的配置如下

# urls.py
from django.urls import path
from myapp.views import MyView
 
urlpatterns = [
    path('about/', MyView.as_view()),
]

CBV分析

函数名或者方法名遇到括号执行优先级最高

对象查找属性或方法的顺序
	永远都是先从自己身上找
	然后去产生对象的类中找
	再去类的父类中找 如果都没有才会报错
posted @ 2021-12-26 14:07  OVO_3V3  阅读(48)  评论(0编辑  收藏  举报