PYTHON 八月 29, 2019

第2节、视图

文章字数 18k 阅读约需 17 mins. 阅读次数 1000000

一、视图的概念

(1) 视图的作用

接收用户的请求 并响应给用户

(2) 视图函数的本质

python的函数

(3) 视图的响应

  1. 网页
    • 重定向
    • 错误模板
      • 404 NOT_FOUND
      • 500 SERVER_ERROR
      • 400 BAD_REQUEST
  2. json 数据

二、url配置

路由

处理url地址与视图函数之间的程序 称之为路由

(1) 配置

制定根级的url(django帮你配置好的)

ROOT_URLCONF = 'helloworld.urls'

(2) urlpatterns 列表

装有所有路由地址的列表

url 参数:

  • regexp 正则
  • view 视图函数名
  • name 给当前的url起名字 (url的反向解析)

url中正则的参数的使用:

  • r 必须 转义特殊字符
  • ^ 必须 必须完全匹配
  • $ 必须 必须完全匹配

注意: 也就是正则路由存在 ^和$就是和url请求的地址完全匹配 而不是 包含关系

(3) 不带参数的url

urlpattern = [
  url(r'^test/$', views.test), 
]
views.py
def test(req):
    return HttpResponse('test')

(4) 带一个参数的url

urlpattern = [
  url(r'^arg/(\d{2})/$', views.test),  #参数2个数值
]
views.py
def arg(req,arg1):
    return HttpResponse(arg1)

请求地址为 :http://127.0.0.1:8000/arg/11/

注意:

路由地址想要带参数 则必须添加() 作为值的存储

(5) 带多个参数的url

urlpattern = [
  url(r'^args/(\w{2})/(\w{2})/$',views.args) #带多个参数的路由地址
  url(r'^args/(\w{2})_(\w{2})/$',views.args), #带多个参数的路由地址
]

#带多个的参数的视图函数
def args(req,arg1,arg2):
    return HttpResponse('arg1的值为{} arg2的值为{}'.format(arg1,arg2))

请求地址为:http://127.0.0.1:8000/arg/11/22/

http://127.0.0.1:8000/arg/11_22/

(6) 一个视图函数 是否可以有多个路由地址

路由地址和flask一样,可以多个路由指向同一个视图函数

三、反向解析

概述: 如果模板中的链接或者使用的url为硬链接 则路由地址一旦发生改变 所有地址都要修改 增加了后期代码的维护 所以所有地址都要动态生成 减轻后期维护

作用于: 模板中

使用方法:

  1. 在helloworld/urls.py的 include 添加namespace属性

    url(r'^',include('App.urls',namespace='App')),
  2. 给App/urls.py 的url方法 添加name属性

    url(r'^test/$', views.test,name='test'),  # /test/
  3. 在模板中使用

    <h1>反向解析</h1>
    <a href="/test/" target="_blank">去test视图函数</a>
    <hr>
    <a href="{% url 'App:test' %}" target="_blank">去test视图函数</a>

四、request对象

(1) request对象

每个视图函数 都必须有一个形参 接受django传递过来的用户请求的对象 request

(2) 概述

服务器接收到用户请求以后 会创建出request对象 视图的第一个参数 就是request对象

(3) 属性

  1. path 只请求的路径

  2. method 获取请求的方式

  3. GET 获取get请求参数

    • 获取某一个参数

      request.GET.get(‘key’)

    • 如果key重名

      request.GET.getlist(‘key’)

  4. POST 获取POST的请求参数

  5. FILES 获上传文件

  6. COOKIES 获取请求过来的cookie

  7. session 获取session数据

  8. META 包含了http请求的所有header头信息

    格式化后显示

    def requestAttr(request):
        values = request.META.items()
        html = []
        for k,v in values:
            html.append('<tr><td>{}</td><td>{}</td></tr>'.format(k,v))
        # return HttpResponse('request属性')
        return HttpResponse('<table>%s</table>'%'\n'.join(html))

    常用的key值

    • REMOTE_ADDR 库户端IP地址
    • HTTP_USER_AGENT 浏览器和系统的信息的字符串
    • HTTP_REFERER 获取从哪里点击过啦的链接地址

(4) 方法

  1. get_full_path() 获取完整的请求(不包括域名和端口)
  2. get_host() 获取主机和端口
  3. is_ajax() 判断是否为ajax请求

五、HttpResponse 响应

概述: 给浏览器进行响应

(1) 响应的方法

HttpResponse()

特点: 不调用模板 直接进行内容的响应

实例:

from django.http import HttpResponse
def index(request):
    return HttpResponse('响应内容')

属性:

res = HttpResponse()

  1. res.content 设置/获取内容
  2. res.status_code 设置/获取状态码
  3. res.charset 设置/获取字符编码

方法:

  1. write() 写内容
  2. set_cookie() 设置cookie
  3. delete_cookie() 删除cookie

六、重定向 redirect

  1. HttpResponseRedirect
  2. redirect

(1)HttpResponseRedirect/redirect 重定向

导入:

from django.http import HttpResponseRedirect

from django.shortcuts import redirect

实例

测试用视图和路由地址

url(r'^$',views.index,name='index'),
def index(request):
    return render(request,'index.html')

url(r'^args/(\w+)/(\d{1,2})/',views.args,name='args'),
#带参数的路由地址
def args(request,name,age):
    return HttpResponse("name:{}\nage:{}".format(name,age))

跳转无参路由地址 index

url(r'^redirect/$',views.myRedirect,name='myRedirect'), #测试重定向的路由

#重定向测试的视图函数
def myRedirect(request):
    #不带参的重定向  跳转到首页
    return HttpResponseRedirect('/')
    return redirect('/')

跳转有参路由地址 args

#重定向测试的视图函数
def myRedirect(request):
    #带参的重定向  跳转到args
    return HttpResponseRedirect('/args/lisi/18/')
    return redirect('/args/lisi/18/')

(2) reverse 通过namespace 和url的name值 反向构造出路由地址

reverse 和 flask中的url的作用一样

导入

from django.urls import reverse

构造不传参路由地址

reverse("App:testResponse") #动态解析路由地址 == url_for()  
/testresponse/

构造传参路由地址

reverse("App:args",args=['wangwu',20])
/args/wangwu/20/

关键字参数构造路由地址

将App/urls.py的url中的正则路由更改

url(r'^args/(?P<name>\w+)/(?P<age>\d{1,2})/',views.args,name='args'),

反向解析路由地址关键字参数

reverse("App:args",kwargs={'name':'wangwu','age':20})
/args/wangwu/20/

(3) redirect和reverse组合使用

#重定向测试的视图函数
def myRedirect(request):
    #正常传参
    return HttpResponseRedirect(reverse("App:args",args=['wangwu',20]))
    #关键字传参
    return redirect(reverse("App:args",kwargs={'name':'zhaoliu','age':30}))

(4) 模板中的动态生成url地址

1) 无参路由

<a href="{% url 'App:index' %}">首页</a>  #/

2) 构造带参路由地址

<a href="{% url 'App:args' 'lisi' 20 %}">args</a>  #/args/lisi/20/

3) 关键字参数构造路由地址

<a href="{% url 'App:args' name='lisi' age=20 %}"> #/args/lisi/20/

注意:

关键字参数的路由地址为

url(r'^args/(?P<name>\w+)/(?P<age>\d{1,2})/',views.args,name='args'),

七、COOKIE 操作

(1) 设置cookie

Response.set_cookie(

​ key,

​ value,

​ max_age,

​ expires,

​ path, 生效的路径

​ domain, 生效的域名

​ secure, 设置HTTPS传输

​ httponly, 仅http传输 不能使用js获取cookie

)

过期时间都是以秒为单位的

实例:

#路由地址
url(r'^setcookie/',mycookie.set_cookie,name='setcookie'),

#设置cookie
def set_cookie(req):
    # return HttpResponse('set_cookie')
    res = HttpResponse('设置cooke')
    res.set_cookie('name','zhangsan') #默认浏览会话结束
    return res

(2) 设置cookie并设置过期时间

url(r'^setcookielifetime/',mycookie.set_cookie_lifetime,name='set_cookie_lifetime'),

#设置cookie并设置过期时间
def set_cookie_lifetime(req):
    res = HttpResponse('设置cooke并设置过期时间')
    # res.set_cookie('name','lisi',max_age=60)
    res.set_cookie('name','lisi',expires=60)
    return res

(3) 获取cookie

url(r'^getcookie/',mycookie.get_cookie,name='get_cookie'),

#获取cookie
def get_cookie(req):
    print(req.COOKIES)
    value = req.COOKIES.get('name')
    return HttpResponse("值为{}".format(value))

(4) 删除cookie

url(r'^deletecookie/',mycookie.del_cookie,name='del_cookie'),

#删除cookie
def del_cookie(req):
    res = HttpResponse('删除cookie')
    res.delete_cookie('name')
    return res

八、session

概述: http是无状态协议 每一次请求都是一个新的会话

使用cookie和session进行用户状态的维持 在客户端或者客户端和服务器端 存储有关会话的数据

存储方式:

  1. cookie 将所有数据都存储在客户端,都是明文存储,所以不要存敏感的数据,并且存储数据有大小的限制
  2. session 将数据存储在服务器端,客户端使用cookie存储session的唯一id值,sessionid

(1) 开启session

settings.py文件

INSTALLED_APPS = [
    'django.contrib.sessions',
]
MIDDLEWARE = [
    'django.contrib.sessions.middleware.SessionMiddleware',
]

(2)使用session

启用session后 每一个request请求 都有session属性

(3) 设置session

生成session存储所需要的系统表

python3 manage.py migrate

设置:

request.session[key] = value

#设置session
def set_session(req):
    req.session['name'] = 'zhangsan'
    req.session['sex'] = 'sex'
    return HttpResponse('设置session')

(4) 设置session并设置过期时间

session默认存活时间为两周

request.session.set_expiry(value)

value值:

  • integer 整数 秒
  • 0 当前浏览会话结束
  • datetime
  • timedelta
  • None 依赖于全局session过期
#设置session并设置过期时间
def set_session_lifetime(req):
    req.session.set_expiry(60) #过期时间1分钟
    req.session['name'] = '张三'
    return HttpResponse('设置session并设置过期时间')

(5) 获取session

#获取session
def get_session(req):
    print(req.session)
    v = req.session.get('name','default')
    return HttpResponse('获取session-----{}'.format(v))

(6) 删除 session

  1. clear() 清空所有session 但是不会将表中的session清除
  2. flush() 清空所有 并删除表中的session数据
  3. logout(request) 清空所有 并删除表中的session数据
  4. del request.session[‘name’]

clear 清空所有session 但是不会将表中的session清除

#清除session
def del_session(req):
    req.session.clear() #清除所有session 不删除表中数据
    return HttpResponse('清除session')

flush 清空所有 并删除表中的session数据

#清除session
def del_session(req):
    # req.session.flush() #清除所有session
    return HttpResponse('清除session')

logout 清空所有 并删除表中的session数据

from django.contrib.auth import logout

#清除session
def del_session(req):
    logout(req) ##清除所有session
    return HttpResponse('清除session')

del 删除某一个session值

#清除session
def del_session(req):
    del req.session['name']
    return HttpResponse('清除session')

(7) 设置session的保存位置

1) 默认保存在数据库的 django_session表中

SESSION_ENGINE = 'django.contrib.sessions.backends.db' 

2) 保存在内存中 cache

SESSION_ENGINE = 'django.contrib.sessions.backends.cache' 

3) 保存在内存和表中

先去内存中查找 如果不存在则去表中查找 效率高 安全性高

SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'

4) 使用redis缓存 session

安装:

pip3 install django-redis-sessions

配置settings.py

#使用redis缓存session
SESSION_ENGINE = 'redis_sessions.session' #redis存储session
SESSION_REDIS_HOST = '127.0.0.1' #主机
SESSION_REDIS_PORT = '6379' #端口
SESSION_REDIS_DB = 0 #选择数据库

(8) session的全局配置

SESSION_COOKIE_NAME = 'sessionid'
SESSION_COOKIE_AGE = 1209600 #设置cookie存活时间 设置session的存活时间

(9) session常用的操作

#设置获取删除session
request.session[key] = value
request.session.get(key)
request.session.clear()
request.session.flush()
logout(request)
del request.session[key]

#session其它操作
req.session.keys()
req.session.values()
req.session.items()

#获取session  key的值
req.session.session_key

九、使用session登录实例

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


#登录
def login(req):
    # return HttpResponse('login')
    return render(req,'login.html')


#登录处理
def dologin(req):
    username = req.POST.get('username')
    userpass = req.POST.get('userpass')
    if username=='zhangsan' and userpass=='123456':
        req.session['uid'] = 1
        req.session['username'] = username
        return redirect(reverse('App:index'))

    return redirect(reverse('App:login'))


#退出登录
def logout(req):
    req.session.flush()
    return HttpResponse("<meta http-equiv='refresh' content='4;/'>退出成功4秒后条到首页 如不能跳到首页 请手动点击<a href='/'>首页</a>")

上一篇:
下一篇:
0%