TypechoJoeTheme

快把钟哥带走

zyz

网站页面
标签搜索

03-Django视图

zyz
2018-06-24
/
0 评论
/
1,216 阅读
/
正在检测是否收录...
06/24

一、视图概述

Django用视图这个概念封装处理用户请求并返回响应的逻辑。
定义视图函数相关的URL(网址) (即规定 访问什么网址对应什么内容)。或者说视图接受Web请求,并响应Web请求。

视图的本质就是一个python函数.

- 响应
    网页(包含重定向、错误视图404、错误视图500、错误视图400)
    JSON数据
- 过程
    用户在浏览器中输入网址www.zyz.com/meituan/detail.html
    django获取到网址信息,截取掉IP和端口 meituan/detail.html
    对应虚拟路径和文件名,在url管理器中逐个匹配urlconf列表 detail
    调用视图管理器中的detail,返回对应结果给浏览器

二、URL配置

  • 配置流程
- URL配置文件
    settings.py文件中ROOT_URLCONF=project.urls (默认已经配置好)
- project.urls.py文件
    urlpatterns是一个url实例列表
    url对象(正则表达式,视图名称,名称)
    例如: url(r'^admin/', admin.site.urls,name='admin')
- url匹配正则注意事项
    想要从url中获取一个值,需要对正则加小括号(即分组)
    匹配正则前方不需要加反斜杠
    正则前面需要加r表示字符串不转义
  • 引入其他配置
- 在应用中创建urls.py文件,配置该应用内的路由
from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^$', views.index),
    url(r'^(\d+)/$', views.detail),
]

- 在工程目录中urls.py分发到对应应用中
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^zyz/', include('myapp.urls')),
]
  • 反向解析
- 概述: 如果在视图、模板中使用了硬编码链接,在url配置发生改变时,动态生成链接地址
- 解决: 在使用链接时,通过url配置的名称,动态生成url地址
- 作用: 使用url模板

三、视图函数

  • 定义视图
- 本质: 视图即是一个函数
- 参数: 一个HttpRequest对象,通过正则表达式获取的参数
- 位置: 一般会在views.py中定义
  • 错误视图
- 404视图   
    找不到网页时返回(url匹配不成功)
    在temmplates目录下定义404.html({{request_path}}会输出导致错误的网址)
    配置settings.py(DEBUG如果为True永远不会调用404.html页面)
    配置settings.py(ALLOWED_HOSTS=['*'])

- 505视图
    视图代码出现错误(服务器错误)
- 400视图
    错误出现在客户的操作

四、HttpRequest对象

  • 概述
- 服务器接收http请求后,会根据报文创建HttpRequest对象
- 视图的第一个参数就是HttpRequest对象
- django创建的,之后调用视图时传递给视图
  • 属性
- path 
    请求的完整路径(不包括域名和端口)
- method 
    请求的方式,常用有GET、POST
- encoding
    浏览器提交数据的编码方式
- GET
    类似字典对象,包含get请求的所有参数
- POST
    类似字典对象,包含post请求的所有参数
- FILES
    类似字典对象,包含所有上传的文件
- COOKIES 
    字典,包含所有的cookie
- session
    类似字典对象,表示当前会话
  • 方法
- is_ajax()
    通过XMLHttpRequest发起的,就会返回True
  • QueryDict对象
- request对象中的GET、POST都属于QueryDict对象
- get() 
    根据键获取值(只能获取一个)
- getlist()
    根据键获取值(返回的是一个列表,可以获取多个值)
  • GET属性
- 获取浏览器传递给服务器的数据
- 例如: http://127.0.0.1:8000/zyz/get1?a=1&b=2&c=3
def get1(request):  
    a = request.GET.get('a')
    b = request.GET['b']
    c = request.GET.get('c')

    return HttpResponse('a:%s  b:%s  c:%s' % (a,b,c))
- 例如: http://127.0.0.1:8000/zyz/get2?a=1&a=2&b=3
def get2(request): 
    a = request.GET.getlist('a')
    a1 = a[0]
    a2 = a[1]

    b = request.GET['b']

    return HttpResponse('a1:%s  a2:%s  b:%s' % (a1, a2, b))
  • POST属性
def register(request):
    # 例如在输入框中对应name属性
    name = request.POST['user']
    passwd = request.POST.get('passwd')
    tel = request.POST.get('tel')

    return HttpResponse('注册成功,%s正在登录中....' % (name))

使用表单提交post请求时,需要关闭csrf(settings.py中的MIDDLEWARE内的'django.middleware.csrf.CsrfViewMiddleware', )

五、HttpResponse对象

  • 概述
- 用于给浏览器返回数据
- HttpRequest对象是django创建的,HttpResponse对象是自己创建的
  • 返回操作
- 不调用模板(HttpResponse)
    def index(request):
        return HttpResponse('hello zyz!!!')
        
- 调用模板(render)
    原型: render(request,templateName,[context...])
    作用: 结合数据和模板,返回完整的HTML页面
    参数: request(请求体对象)、templateName(模板路径)、context(传递给模板的数据)
    例如: return render(request,'myapp/students.html',{'students':studentList})
  • 属性
- content 
    返回的内容
- charset
    返回的编码类型
- status_code
    返回的状态码(200/304/404)
- content-type
    指定输出的MIME类型
  • 方法
- init 
    使用页面内容实例化HttpResponse对象
- write(content)
    以文件的形式写入
- flush()
    以文件的形式输出缓冲区
- set_cookie(key,value)
    设置cookie
- delete_cookie(key)
    删除cookie
    删除一个不存在的key,就当什么都没发生
  • 子类HttpResponseRedirect
- 作用
    重定向,服务器端的跳转
- 简写
    # return  HttpResponseRedirect('/redirect2') 
    from django.shortcuts import redirect
    return redirect('/redirect2')
  • 子类JsonResponse
返回json数据,一般用于异步请求
    __init__(self,data)
    data 字典对象

Content-type类型: application/json

六、状态保持

  • 概述
- http协议是无状态的,每次请求都是一次新的请求,不会保持之前的请求状态
- 客户端与服务器的一次通信就是一次回话
- 实现状态保持,在客户端或服务器存储有关回话数据
- 存储方式
    cookie: 所有数据存储在客户端(不要存储敏感的数据)
    session: 所有数据粗才能在服务端(在客户端用cookie存储session_id)
- 状态保持的目的
    在一段时间内跟踪请求者的状态,可以实现跨页面访问当前的请求者数据
  • 启用session
在settings文件中(默认是已经启用)
    INSTALLED_APPS: 'django.contrib.sessions',
    MIDDLEWARE: 'django.contrib.sessions.middleware.SessionMiddleware',
  • 使用session
- 启用session后,每个HttpRequest对象中都会有session属性(类似字典的对象)
- get(key,default=None)
    根据键获取session值
- clear()
    清除所有的会话
- flush()
    删除当前的会话并删除会话的cookie
- 

要注意浏览器中会有缓存问题!

  • 设置过期时间
set_expiry(value)
    value是整数(秒数): request.session.set_expiry(10)
    value是时间对象
    value是0: 关闭浏览器时失效
    value是None: 永不过期

默认有效时间为两周

  • 存储session的位置
- 数据库
    默认存储在数据库中,在settings.py中添加
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'
- 缓存
    只存储在本地内容中,如果丢失不能找回,但速度会比在数据库中快
    SESSION_ENGINE = django.contrib.sessions.backends.cache'
- 数据库和缓存
    有限从本地缓存中读取,读取不到再去数据库中获取
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
  • 使用redis缓存session
- 安装redis: pip3 install django-redis-sessions
- 在settings.py中添加
    # redis服务相关信息
    SESSION_ENGINE = 'redis_sessions.session'
    SESSION_REDIS_HOST = 'localhost'
    SESSION_REDIS_PORT = 6379
    SESSION_REDIS_DB = 0
    SESSION_REDIS_PASSWORD = '123456'
    SESSION_REDIS_PREFIX = 'session'
- 使用时还需要启动redis
    
赞(0)
评论 (0)