Django中视图介绍

一,概述

1. 作用

视图接受web请求,并响应web请求

2. 本质

视图就是Python中的函数

3. 响应类型

  1. 网页
    1. 重定向
    2. 错误视图:404错误,500错误
  2. JSON数据

4. 响应过程

  1. 用户在浏览器输入网址
  2. Django获取网址信息,去除IP地址与端口号
  3. 逐个匹配URL配置,
    1. 匹配成功,执行对应的视图函数
    2. 匹配失败,报404错误
  4. 视图管理器找到对应的视图执行,返回结果给浏览器

二,URL配置

1. 配置流程

  1. 指定根级URL配置文件
    \Django\MyDjango\project\project\settings.py 中的
ROOT_URLCONF = 'project.urls'
  1. \Django\MyDjango\project\project\urls.py 文件,urlpatterns是URL的实例的列表,传入URL对象
urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^',include('MyApp.urls')),
]
1. URL对象包括:正则表达式,视图名称,名称
  1. URL匹配正则的注意事项
    1. 如果需要从URL中获取一个值,需要对值的正则加小括号
    2. 匹配正则开始网址不需要加反斜杠,因为在\Django\MyDjango\project\project\urls.py 文件 或 \Django\MyDjango\project\project\settings.py 文件中已经添加反斜杠
    3. 正则表达式外面需要加r,表示字符串不转义
    4. 例如:\Django\MyDjango\project\project\settings.py

2. 引入其他URL配置

  1. 在应用中创建urls.py ,定义本应用的URL配置,在工程urls.py 文件中使用include() 方法
  2. 示例代码
# \Django\MyDjango\project\project\urls.py 文件配置
from django.contrib import admin
from django.urls import path,include
from django.conf.urls import url

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^',include('MyApp.urls',namespace="MyApp")),
]

# \Django\MyDjango\project\MyApp\urls.py 文件配置
from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^$',views.index),
    url(r'^(\d+)/(\d+)$',views.detail),
    url(r"^Grades/$",views.Grades)
]

3. URL的反向解析

  1. 概述:如果在视图、模板中使用了硬编码链接,在URL配置发生改变时,动态生成链接的地址
  2. 解决:在使用链接时,通过URL配置的名称,动态生成URL地址
  3. 作用:使用URL模板

三,视图函数

1. 定义视图

  1. 本质:是一个Python函数
  2. 视图参数
    1. 一个HTTPRequest的实例
    2. 通过正则表达式获取的参数
  3. 位置:\Django\MyDjango\project\MyApp\views.py 中定义

2. 错误视图

  1. 404视图
    1. 找不到网页时返回(URL匹配不成功)
    2. 定义路径:\Django\MyDjango\project\templates\404.html
    3. 定义内容
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>404页面</title>
</head>
<body>
    <h1>页面丢失</h1>
    <h2>{
    
    {
    
    request__path}}</h2> # 导致错误的网址
</body>
</html>
4. 配置settings.py
# DEBUG为True,不会调用404.html页面
DEBUG = False
# 允许访问的host
ALLOWED_HOSTS = ["*"]
5. 
  1. 500视图:在视图代码中出现错误(服务器代码)
  2. 400视图:错误出现在客户端的操作

四,HttpRequest 对象

1. 概述

  1. 服务器接收 http 请求后,Django会根据报文创建 HttpRequest 对象,视图的第一个参数就是 HttpRequest 对象,之后调用视图时传递给视图

2. 属性

  1. path
    请求的完整路径(不包括域名和端口号)
  2. method
    请求方式,get,post
  3. encoding
    表示浏览器提交数据的编码方式,一般为 utf-8
  4. GET
    类似字典的对象,包含了get请求的所有参数
  5. POST
    类似字典的对象,包含了post请求的所有参数
  6. FILES
    类似字典的对象,包含了所有上传的文件
  7. COOKIES
    字典,包含所有的cookie
  8. SESSION
    类似字典的对象,表示当前会话

3. 方法

  1. is_ajax()
    如果是通过 XMLHttpRequest 发起的,返回True

4. QueryDict 对象

  1. 概述:request 对象中的 GET,POST 都属于 QueryDict 对象
  2. 方法
    1. get() 作用:根据键获取值,只能获取一个值
    2. get() 示例:www.baidu.com/abc?a=1&b=2&c=3
    3. getlist() 作用:将键的值以列表的形式返回,可以获取多个值
    4. getlist() 示例:www.baidu.com/abc?a=1&a=2&c=3

5. GET属性

1. 一个属性获取一个值

  1. \Django\MyDjango\project\MyApp\views.py 文件增加以下代码
# 获取GET传递的数据
def GetOneAttribles(request):
    AttributeA = request.GET.get("a")
    AttributeB = request.GET.get("b")
    AttributeC = request.GET.get("c")
    Sum = int(AttributeA) + int(AttributeB) + int(AttributeC)
    #return HttpResponse(AttributeA + "  " + AttributeB + "  " + AttributeC)
    return HttpResponse(Sum)
  1. 配置APP中的url信息
  2. 访问地址:http://127.0.0.1:8000/GetOneAttribles/?a=1&b=2&c=3
    在这里插入图片描述

2. 一个属性获取多个值

  1. \Django\MyDjango\project\MyApp\views.py 文件增加以下代码
# 获取GET传递的数据
def GetMultipleAttribles(request):
    AttributeAList = request.GET.getlist("a")
    a1 = AttributeAList[0]
    a2 = AttributeAList[1]
    AttributeC = request.GET.get("c")
    return HttpResponse(a1 + "" + a2 + "" + AttributeC)
  1. 配置APP中的url信息
  2. 访问地址:http://127.0.0.1:8000/GetOneAttribles/?a=1&a=3&c=3
    在这里插入图片描述

6. POST属性

  1. \Django\MyDjango\project\MyApp\urls.py 文件中增加路由信息
url(r"^ShowRegist/$",views.ShowRegist),
url(r"^ShowRegist/Regist/$", views.Regist),
  1. \Django\MyDjango\project\MyApp\views.py 在增加请求方法
# 获取POST传递的值
def ShowRegist(request):
    return render(request,"MyApp/Regist.html")

def Regist(request):
    Name = request.POST.get("name")
    Gender = request.POST.get("gender")
    Age = request.POST.get("age")
    Hobby = request.POST.getlist("hobby")
    print("Name:%s,Gender:%s,Age:%s,Hobby:%s"%(Name,Gender,Age,Hobby))
    return HttpResponse("POST请求成功")
  1. 模板中增加注册页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
</head>
<body>
    <form action="Regist/" method="post">
        姓名:<input type="text" name="name" value=""/>
        <hr/>
        性别:<input type="radio" name="gender" value="1"/><input type="radio" name="gender" value="0"/><hr/>
        年龄:<input type="text" name="age" value=""/>
        <hr/>
        爱好:<input type="checkbox" name="hobby" value="power"/>权利<input type="checkbox" name="hobby" value="money"/>金钱<input type="checkbox" name="hobby" value="girl"/>美女
        <hr/>
        <input type="submit" value="注册">
    </form>
</body>
</html>
  1. \Django\MyDjango\project\project\settings.py 中间件将CSRF行代码注释
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
  1. 浏览器访问页面填写表单,并点击注册按钮,即可打印输出注册信息,后续可以使用模型对象,连接数据库保存
    在这里插入图片描述
    在这里插入图片描述

五,HttpResponse 对象

1. 概述

  1. 作用:给浏览器返回数据
  2. HttpRequest对象是由Django创建的,HttpResponse对象是由程序员创建的

2. 返回用法

1. 不调用模板,直接返回数据

  1. 代码如下
def Regist(request):
    Name = request.POST.get("name")
    Gender = request.POST.get("gender")
    Age = request.POST.get("age")
    Hobby = request.POST.getlist("hobby")
    print("Name:%s,Gender:%s,Age:%s,Hobby:%s"%(Name,Gender,Age,Hobby))
    return HttpResponse("POST请求成功")
  1. 效果如下图
    在这里插入图片描述

2. 调用模板,使用 render() 方法

  1. 原型:render(request,templateName[,context])
  2. 作用:结合数据和模板,返回完整的HTML页面
  3. 参数
    1. request:请求体对象
    2. templateName:模板路径
    3. 传递给需要渲染在模板上的数据
  4. 示例
# 查询年龄大于30或小于20的学生列表
from django.db.models import Q
def GetAgeGTThrityOrLTTwentyOfStudent(request):
    StudentsList = Student.StudentObj2.filter(Q(studentAge__gt=30)|Q(studentAge__lt=20))
    return render(request, 'MyApp/students.html', {
    
    "studentsHtml": StudentsList})

3. 属性

1. content:表示返回内容的

2. charset:编码格式

3. status_code:响应状态码,200,304,404

4. content-type:指定输出的MIME类型

4. 方法

1. init:使页面内容实例化HttpResponse对象

2. write(content):以文件的形式写入

3. flush():以文件的形式输出缓冲区

4. set_cookie(key,value="",max_age=None,exprise=None):设置cookie

5. delete_cookie(key):删除cookie,如果删除一个不存在的key,就当什么都没发生

猜你喜欢

转载自blog.csdn.net/zhuan_long/article/details/114213999