django学习——视图View

python进阶——django学习之View

概述

  • 作用:视图接收web请求,并响应web请求
  • 本质:视图就是一个python中的函数
  • 响应
  1. 网页
    重定向
    错误视图:404、500等
  2. JSON数据
  • 过程

URL配置

配置流程

  • 指定跟级url配置文件
  1. settings.py文件中的ROOT_URLCONF
  2. ROOT_URLCONF='项目名称.urls'——默认

urlpatterns

  • 一个url实例的列表
  • url对象
  1. 正则表达式
  2. 视图名称
  3. 名称——用于反向解析
  4. url匹配正则的注意事项
    (1)如果想要从url中获取一个值,需要对正则加小括号
    (2)匹配正则前方不需要加反斜杠
    (3)正则前需要加 'r' 表示不转义

引入其他url配置

  • 在应用中创建url.py文件,定义本应用的url配置,在项目url.py文件中使用include()方法
  • 匹配过程
  1. 用户在发送url请求
  2. 项目urls.py文件将url传递给应用urls.py文件
  3. 应用urls.py文件处理url请求,并返回给用户相应的数据

URL的反向解析(什么是反向解析?)

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

视图函数

定义视图

  • 本质:一个函数
  • 视图参数
  1. 一个HttpRequest的实例
  2. 通过正则表达式获取的参数
  • 位置:一般在views.py文件下定义

错误视图

  • 400视图:错误出现在客户端的操作,在templates目录下定义404.html
  • 404视图
  1. 找不到网页,即url匹配不成功
  2. 在templates目录下定义404.html
    request_path——导致错误的网址
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, 
                       initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>404页面</title>
    </head>
    <body>
        <h1>页面丢失</h1>
        <h2>{{request_path}}</h2>
    </body>
    </html>
  3. 配置settings.py文件
    DEBUG = True
    ALLOWED_HOSTS = ['*']
  • 500视图:在视图代码中出现错误(服务器代码)

HttpRequest对象

概述

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

属性

属性概述
path请求的完整路径(不包括域名和端口)
method表示请求的方式,常用的有GET、POST
encoding表示浏览器提交的数据的编码方式,一般为UTF-8
GET类似字典的对象,包含了get请求的所有参数
POST类似字典的对象,包含了POST请求的所有参数
FILES类似字典的对象,包含了所有上传的文件
COOKIES类似字典的对象,包含了所有的COOKIES
session类似字典的对象,表示当前会话

方法

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

QueryDict对象

  • request对象中的GET、POST都属于QueryDict对象
  • 方法
  1. get()
    (1)作用:根据键获取值
    (2)只能获取一个值
  2. getlist()
    (1)作用:将键的值以列表的形式返回
    (2)可以获取多个值

GET属性

  • 获取浏览器传递给服务器的数据
# get()示例,http://127.0.0.1:8000/index/get?a=1&b=2&c=3
def get1(request):
    a = request.GET.get('a')
    b = request.GET.get('b')
    c = request.GET.get('c')
    return HttpResponse(a+"-"+b+"-"+c)

# getlist()示例,http://127.0.0.1:8000/index/get?a=1&a=2&c=3
def get2(request):
    a = request.GET.get('a')
    a1 = a[0]
    a2 = a[1]
    c = request.GET.get('c')
    return HttpResponse(a1+"-"+a2+"-"+c)

POST属性

  • 使用表单提交实现post请求
  • 关闭CSRF(什么是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',
]
  • 代码示例——实现注册
def regist(request):
    name = request.POST.get("name")
    gender = request.POST.get("gender")
    age = request.POST.get("age")
    hobby = request.POST.getlist("hobby")
    return HttpResponse(name+"-"+gender+"-"+age+"\n"+hobby)

HttpResponse对象

概述

  • 作用:给浏览器返回数据
  • HttpRequest对象由django创建,HttpResponse对象由程序员创建

返回数据用法

  • 不调用模板,直接返回数据
# 示例
from django.http import HttpResponse
def index(request):
    return HttpResponse("Hello World!")
  • 调用模板:使用render方法
  1. 原型:render(request, templateName, [context]),[context]可有可无
  2. 作用:结和数据和模板,返回完整的HTML页面
  3. 参数
    (1)request——请求体对象
    (2)templateName——模板名
    (3)context——传递给需要渲染在模板上的数据
  4. 示例
# 示例
from django.http import HttpResponse
def index(request):
    return render(request, 'myApp/index.html')

属性

属性概述
content表示返回的内容
charset编码格式
status_code响应状态码(200、304、404...)
content-type指定输出的MIME类型(什么是MIME?)

方法

方法概述
init使用页面内容实例化HttpResponse对象
write(content)以文件的形式写入
flush()以文件的形式输出缓冲区
set_cookie(key, value='', max_age=None, exprise=None)增加cookie
delete_cookie(key)删除cookie
注意:如果删除一个不存在的key,则不发生任何情况

子类HttpResponseRedirect

  • 功能:重定向,服务器端的跳转(待实践)
# 示例代码
from django.conf.urls import url
urlpatterns = [
    url(r'^$', views.index),
    url(r'^index.html', views.index1),
]
# 代码示例
from django.http import HttpResponseRedirect
from django.shortcuts import render

def index(request):
    return render(request,'myApp/index.html')

def index1(request):
    return HttpResponseRedirect('/')
  • 简写:redirect(to)
# 代码示例
from django.http import HttpResponseRedirect
from django.shortcuts import redirect

def index(request):
    return render(request,'myApp/index.html')

def index1(request):
    return redirect('/')
  • to推荐使用url反向解析

子类JsonResponse

  • 返回json数据,一般用于异步请求(Ajax为异步请求)
  • __init__(self, data)
  • data——字典对象
  • 注意:Content-type类型为application/json

状态保持

概述

  • http协议是无状态的,每次请求都是一次新的请求,不存储之前的请求
  • 客户端与服务器的一次通信就是一次会话
  • 实现状态保持,在客户端或者在服务端存储有关会话的数据
  • 存储方式
  1. cookie:所有的数据存储在客户端,不要存储敏感的数据,不安全且存储量小
  2. session:所有的数据存储在服务端,在客户端用cookie存储session_id
  • 状态保持的目的:在一段时间内跟踪请求者的状态,可以实现跨页面访问当前的请求者的数据
  • 注意:不同的请求者之前不会共享这个数据,与请求者一一对应

启用Session

  • 在settings.py文件
  1. INSTALLED_APPS列表:'django.contrib.sessions'(默认启用)
  2. MIDDLEWARE列表:'django.contrib.sessions.middleware.SessionMiddleware'(默认启用)

使用Session

  • 每个HttpRequest对象都有一个session属性(启用时),就是一个类似字典对象
  • get(key, default=None)——根据键获取session值
  • clear()——清空所有的会话
  • flush()——删除当前的会话并删除会话的cookie

使用redis缓存session

  • 安装:pip install django-redis-sessions
  • 在settings.py文件中添加
"""在settings.py文件中添加"""
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 0
SESSION_REDIS_PASSWORD = 'password'
SESSION_REDIS_PREFIX = 'session'

----------------------待更新-------------------

 


版权声明:本文为qq_43633412原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。