Django学习8:视图(views)

视图

概述

作用

视图接受Web请求,并且返回Web响应

本质

就是一个Python函数,在views.py文件中定义,也可以是一个类,称为视图类

响应

一般是一个网页的HTML内容、一个重定向、错误信息页面、json格式的数据

URLConf

概述

  1. 指定跟级URL配置文件,在sittings.py文件中的ROOT_URLCONF = ‘工程名.urls’,默认已经设置
  2. urlpatterns:是列表,元素是一个url()实例,url实例可以是正则表达式、视图函数、名称

注意:

  1. 若要从url中捕获一个值,需要在它的周围设置一对圆括号

    1. 每个正则表达式前的 url 表示不转义
    2. 请求的url被堪称一个普通的Python字符,进行匹配时不包括ip和端口

    url(r’^index/(\d+)/(\w+)/$’, views.index)

    def index(request, num, word):
    return HttpResponse(‘Happy day, ’ + num + word)

project/urls.py

url(r'^', include('myApp.urls', namespace='myApp'))

项目目录下urls.py

url(r'^rdns/$', views.world, name='world')

反向解析

概述

如果在视图、模板中使用硬编码的链接,在urlconf发生变化时,维护起来非常的麻烦

在做链接时,通过指向urlconf的名称,动态生成链接地址可以很好的解决

视图:

django.core.urlresolvers.reverse('namespace:name')

模板:

去另个世界去看看

视图函数

定义视图

本质上就是一个函数,参数是一个HttpRequests对象,通过正则表达式组获得的关键字参数,在views.py文件中

错误试图

404视图

  1. 在templates目录下创建404.html,编辑提示信息
  2. 配置sittings.py文件
    DEBUG = False
    ALLOWED_HOSTS = [‘*’]

500视图

HttpRequest对象

概述

服务器收到http协议请求后,会根据报文创建出HttpRequest对象,将该对象传递给了视图,视图的第一个参数就是HttpRequest对象

属性

  1. path:一个字符串,表示请求的页面的完整路径(不包含ip和端口)
  2. method:字符串,表示请求使用的HTTP方法,常用的有get、post
  3. encoding:字符串,表示提交的数据使用的编码方式
  4. GET:类似字典的对象,包含get请求的所有参数
  5. POST:类似字典的对象,包含post请求的所有参数
  6. FILES:类似字典的对象,包含所有上传的文件
  7. COOKIES:标准的Python字典,包含所有的cookie,键值都为字符串
  8. session:类似字典的对象

    def requestFunc(request):
    print(request.path)
    print(request.method)
    print(request.encoding)
    print(request.GET)
    print(request.Post)
    print(request.FILES)
    print(request.COOKIES)
    print(request.session)

    return HttpResponse(‘request’)

方法

  1. is_ajax():如果请求是通过HttpRequest发起的,则返回True

QueryDict对象

定义在django.http.QueryDict

request对象属性中的GET、POST都是QueryDict类型的对象

与Python中的字典不一样,QueryDict可以处理一个键带有多个值得请求

方法:

  1. get():根据键获取值,只能获取一个值,如果一个键同时有多个值,获取最后一个键的值
    1. getlist():将键的值以列表的形式返回,可以获取一个键的多个值

GET属性

  1. http://loclahost:8000/get1?a=1&b=2
    def get1(request):
    a = request.Get.get(‘a’)
    b = request.GET.get(‘b’)

     return HttpResponse(a + b)
    
  2. http://localhost:8000/get2?a=1&a=2
    def get2(request):
    alist = request.GET.getlist(‘a’)

     return HttpResponse(alist[0] + alist[1])
    

POST属性

def postReq(request):
  if request.method == 'GET':
    # 展示注册页面
    return render(request, 'post.html')
  else:
    # 响应注册界面里点击的提交请求
    # 获取POST请求的参数
    username = request.POST.get('username')

    return HttpResponse('接收到POST请求')    

HttpResponse对象

概述

在django.http中定义HttpResponse类,HttpResponse对象是Django自动创建的,HttpResponse对象需要由程序员手动创建

用法

  1. 不调用模板,直接返回数据:return HttpResponse(‘我就是另一个世界’)
  2. 不调用模板,简写返回模板(render):
    原型:render(request, templateName[, context])
    说明:结合一个给定的模板和上下文字典,返回一个渲染后的HttpResponse对象
    参数说明:
    request —> 请求对象,用于生成response对象
    templateName —> 要使用模板的名字
    context —> 上下文字典,字典中的键值用于渲染模板
    示例:return render(request, ‘post.html’)

属性

  1. content:表示返回的内容
  2. charset:表示response采用的编码字符集
  3. status_code:响应状态码
  4. content_type:指定输出的MIME类型

    def response(request):
    res = HttpResponse()
    res.content = b’Nice day’
    res.charset = ‘utf-8’
    res.status_code = 200
    res.content_type = ‘text/plain’
    return res

方法

  1. init:使用页内容实例化HttpResponse对象
  2. write(content):以文件的方式返回
  3. flush():以文件的方式输出缓冲区
  4. set_cookie(key, value, max_age=None, expire=None):设置cookie
    def cookie(request):
    cookies = request.COOKIES
    res = HttpResponse()
    res.content = cookies[‘nian’]
    res.set_coookie(‘nian’, ‘Nice’)

     return res
    
  5. delete_cookie(key)

子类HttpResponseRedirect类

重定向,服务器跳转

def redirect1(request):
  return HttpResponseRedirect('/redirect2')

def redirect2(request):
  return HttpResponse('redirect2')


# 简写
def redirect1(request):
  retrn redirect('/redirect2/')
def redirect2(request):
  return HttpResponse('redirect2')

子类JsonResponse类

返回json数据,一般用于异步ajax请求

状态保持

概念

http协议是无状态的,每一次请求都是一次新的请求,不知道之前都做过什么(通信状态)

每一次客户端请求服务器都是一次性通信,即一次会话

实现状态保持的方式:

在客户端存储与会话有关的数据

存储的方式:

  1. cookie
  2. session
    一般会话session指对象

使用cookie时,所有数据存储在客户端,注意不要存储敏感数据

推荐使用session方式,所有的数据保存在客户端,注意不要存储敏感数据

状态保持的目的:在一段时间内,可以实现跨页面访问当前请求者的数据信息

放心一点:不同的请求者之间不会共享数据,与请求者一一对应

启用session

在settings.py文件中:

INSTALLED_APPS:'django.contrib.sessions'

MIDDLEWARE:'django.contrib.sessions.middleware.SessionMiddleware'

使用session

  1. 启用会话后,每个HttpRequest对象具有一个session属性,这是一个类似字典的对象
  2. get(key, default=None):根据键获取会话的值
  3. clear():清除所有会话
  4. flush():删除当前的会话并删除会话使用的cookie
  5. del request.session[‘username’]

状态保持示例

url(r'^show/$', views.show),
url(r'^login/$', views.login),
url(r'^quit/$', views.quit),

def show(request):
  # 提取session中名为myname的值
  myname = request.session.get('myname', '未登录')
  return render(request, 'show.html', {'username':myname})

def login(request):
  if request.method == 'GET':
    # 展示登陆界面
    return render(request, 'login.html')
  else:
    username = reuqest.POST.get('username')
    passwd = request.POST.get('passwd')
    if username == 'nian' and passwd == '123':
      # 登陆成功,重定向到主页上
      # 将用户名存储到session里
      request.session['username'] = username
      return HttpResponseRedirect('/show/')
    else:
      # 登陆失败
      return redirect('/login/')

from django.contrib.auth import logout
def quit(request):
  logout(request)
  return redirect('/show/')  

过期时间

设置过期时间:

set_expiry(value):

        value可以为0,让会话的cookie在用户关闭浏览器时过期

        value可以为None, 永不过期

如果没有指定,两个星期后失效

存储session

基于数据库的存储

默认的会话存储方式:SESSION_ENGINE = ‘django.contrib.sessions.backends.db’

基于缓存的存储

存储在内存,如果丢失不能找回,比数据库读写速度快:ESSION_ENGINE = ‘django.contrib.backends.cache’

缓存和数据库同时使用

现在缓存中取,如果找不到再去数据库取:SESSION_ENGINE = ‘django.contrib.backends.cache_db’

使用Redis缓存session

SESSION_ENGINE = ‘redis_sessions.session’

SESSION_REDIS_HOST = ‘localhost’

SESSION_REDIS_PORT = 6379

SESSION_REDIS_DB = 0

SESSION_REDIS_PASSWORD = ”

SESSION_REDIS_PREFIX = ‘session’

你可能感兴趣的:(Python:Django学习)