django学习笔记(三)—— V层相关学习

1. URLConf

  • 浏览器访问地址由哪个视图处理有url决定。创建django项目时,默认已在setting.py中配置好了url配置入口:
    默认url配置.png
  • 一般在项目urls.py中包含应用的urls.py,在应用的urls.py中创建具体匹配;
  • urls.py内容为urlpatterns,为url()对象列表。url()在django.conf.urls中定义,有两种用法:
      1. url(r'^', include('booktest.urls')) # 包含应用中urls
      1. url(r'^$', views.index) # 指向应用中具体视图

注意:正则部分前面推荐使用'r',表示字符串不转义,另外匹配的字符串前面不能有'/'。请求url按普通字符串匹配,不包括域名以及get或post参数。

2. 视图

2.1 获取请求参数

  • 直接在请求匹配中获取参数需要在正则表达式中使用小括号,有两种使用方式:
      1. 位置参数:按位置依次在视图内接收小括号中的值;
      1. 关键字参数:使用“?P<参数名>”,例:url(r'book/(?P\d+)$', views.detais)

2.2 内置错误视图

  • django内置404 Page Not Found视图和500 server error视图。
  • 要显示错误视图而不是错误信息,需将默认debug改为False:
    django学习笔记(三)—— V层相关学习_第1张图片
    关闭调试模式.png
    django学习笔记(三)—— V层相关学习_第2张图片
    默认404.png
    django学习笔记(三)—— V层相关学习_第3张图片
    默认500.png
  • 可以自定义404.html和500.html(模板查询有顺序,按一定路径找不到后使用默认页面):
    django学习笔记(三)—— V层相关学习_第4张图片
    自定义错误页面.png

2.3 HttpRequest对象

django收到请求后,会根据报文创建HttpResquest对象,必须在视图的第一个参数。

  • 属性(除非特殊说明,否则属性都是只读的):
    1. path:完整请求路径,不包含域名和请求参数;
    1. method:请求方法,常用的有'GET'和'POST';
    1. encoding:提交数据的编码方式,None表示使用浏览器默认编码方式,一般为utf8。注意这是一个可写属性,修改后对属性的接收使用的是新的编码方式:
      django学习笔记(三)—— V层相关学习_第5张图片
      utf8编码接收参数.png
      django学习笔记(三)—— V层相关学习_第6张图片
      gbk编码接收参数.png
    1. GET:QueryDict类型对象,类似于python字典,包含get方式请求的所有参数;
    1. POST:QueryDict类型对象,类似于字典,包含post方式请求的所有参数;
    1. FILES:类似于字典的对象,包含上传的所有文件;
    1. COOKIES:标准的python字典,包含所有cookies,键和值都是字符串;
    1. session:类字典对象,表示当前会话。注意session也是一个即可读又可写属性;
  • QueryDict对象:
  • 定义在django.http.QueryDict;
  • 用来处理同一个键对多个值的情况;
  • 方法:
    • get('key'):如果有多个值获取最后一个,没有返回None;
    • get('key','default'):没有时返回default值;
    • getlist('key'):返回值列表,如果没有返回[];
    • getlist('key', 'default'):如果没有,返回default值。

2.4 HttpResponse对象

HttpRequest对象由django创建,HttpResponse对象需要用户自定义。

  • 属性:
    1. content:返回的内容
    1. charset:response采用的编码字符集,默认为utf-8;
    1. status_code:响应码;
  • 方法:
    1. set_cookie:set_cookie('key', value='', max_age=None, expires=None)
    • max_age:指定秒后过期;
    • expires:datetime或timedelta对象,会话将在这个指定的日期/时间过期;
    • max_age和expires二选一。如果不指定过期时间,则在关闭浏览器时cookie过期。
    1. del_cookie(key):如果key不存在则不作任何处理;
    1. write():向响应体中写数据;
      django学习笔记(三)—— V层相关学习_第7张图片
      设置response.png
2.4.1 子类JsonResponse

继承自Response,定义在django.http模块,创建对象时接受字典作为参数。JsonResonse对象的Content-Type为'application/json'。

  • 添加jquery文件:
    django学习笔记(三)—— V层相关学习_第8张图片
    添加jquery文件.png
  • 配置静态文件查找目录:
    django学习笔记(三)—— V层相关学习_第9张图片
    配置静态文件加载目录.png
  • 配置url,定义视图
  • 定义页面:
    django学习笔记(三)—— V层相关学习_第10张图片
    页面.png
  • 视图:
    django学习笔记(三)—— V层相关学习_第11张图片
    jsonresponse视图.png
  • 效果:
    django学习笔记(三)—— V层相关学习_第12张图片
    json效果.png
  • 交互过程:
    django学习笔记(三)—— V层相关学习_第13张图片
    json交互过程.png
2.4.2 子类HttpResponseRedirect

也是继承自Response,定义在django.http模块,返回的状态码为302。
使用:return HttpResponseRedirect('/'),简写为return redirect('/')

django学习笔记(三)—— V层相关学习_第14张图片
HttpResponseRedirect使用.png

3. cookie和session

3.1 cookie

cookie由服务器生成,发送到浏览器,以key-value的形式保存在某个目录下的文本文件内,下次请求同一网站时将cookie发送给服务器。
cookie基于域名安全,不同域名的cookie不能互相访问。
浏览器请求某网站时,会将浏览器存储的跟网站相关的所有cookie信息提交给服务器。

  • django中使用cookie
    • 设置cookie:创建HttpResponse对象,使用对象的set_cookie('key', 'value')方法设置cookie;
    • 获取cookie:使用request的COOKIES属性(标准字典)获取cookie;
      django学习笔记(三)—— V层相关学习_第15张图片
      获取和设置cookie视图.png
      django学习笔记(三)—— V层相关学习_第16张图片
      设置cookie前访问
      django学习笔记(三)—— V层相关学习_第17张图片
      设置cookie.png
      django学习笔记(三)—— V层相关学习_第18张图片
      设置cookie后获取cookie.png

3.2 session

cookie是将数据存至浏览器,而且还得时浏览器打开cookie使用时。对于一些重要状态数据,保存至浏览器并不安全,这个时候就需要使用session。
session使用也要浏览器支持cookie,服务器将数据存储起来后,会有唯一对应的id,该id一般作为返回给浏览器的cookie中'sessionid'的值。

  • django默认开启session,在settings.pyMIDDLE_WARE CLASSES中通过中间件开启。如果禁用,则将session中间件删除即可:
    django学习笔记(三)—— V层相关学习_第19张图片
    默认通过中间件开启session.png
  • session存储方式:
      1. 存储在数据库中,如下设置可以不写,默认就是存在数据库中:
        SESSION_ENGINE = 'django.contrib.sessions.backends.db'
      1. 存储在缓存中,在本机内存中,读写更快但关闭后无法找回:
        SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
      1. 混合存储:优先从本机内存存取,如果没有则访问数据库:
        SESSION_ENGINE = 'django.contrib.sessions.cached_db'
  • 以数据库方式存储,需要在应用中添加Session应用(默认已有):
    django学习笔记(三)—— V层相关学习_第20张图片
    包含session应用.png
    django学习笔记(三)—— V层相关学习_第21张图片
    迁移生成的session表.png
    django学习笔记(三)—— V层相关学习_第22张图片
    session表结构.png
    • session_key:sessionid;
    • session_data:设置的session数据经过base64编码后的内容;
    • expire_date:过期时间;
  • session方法:通过request的session属性就行session读写。
      1. 以键值对的形式保存session:
        request.session['key'] = value
      1. 根据键读取值:
        request.session.get('key', 'default')
      1. 清除session,在存储中删除值部分:
        request.session.clear()
      1. 清除session,在存储中删除整条session记录:
        request.session.flush()
      1. 删除指定键值:
        del request.session['key']
      1. 设置会话过期时间,如果不设置则两周后过期:
        request.session.set_expiry(value)
        • value是整数,则在value秒没有活动后过期;
        • value是0则用户会话的Cookie将在浏览器关闭时过期;
        • value是None则永不会过期;
  • session示例
    • 查询数据库发现有一条session记录(应该是之前测试什么添加的):
      数据库有一条session记录.png
    • 解析发现里面值为空:
      django学习笔记(三)—— V层相关学习_第23张图片
      解析session值.png
    • 测试del方法:
      django学习笔记(三)—— V层相关学习_第24张图片
      删除session视图.png
    • 第一次调用:
      django学习笔记(三)—— V层相关学习_第25张图片
      del方法删除session.png

      del方法删除的是session中的键,所以使用不对。

    • 测试session.flush()方法:
      django学习笔记(三)—— V层相关学习_第26张图片
      flush视图.png

      flush删除成功.png
    • 此时查看session值:
      django学习笔记(三)—— V层相关学习_第27张图片
      获取session视图.png
      没有设置session.png
    • 设置session,先调用set_session:
      django学习笔记(三)—— V层相关学习_第28张图片
      定义两个设置session方法.png
      django学习笔记(三)—— V层相关学习_第29张图片
      set_session响应.png
    • 查看数据库:
      Snip20190706_137.png

      可以看出数据库的expire_date和响应的cookie有效时间一致,默认2周。

    • 解码查看session值:
      django学习笔记(三)—— V层相关学习_第30张图片
      解析查看session值.png
    • 调用set_session2设置:
      django学习笔记(三)—— V层相关学习_第31张图片
      第二次设置session响应.png
    • 再次查看数据库:
      django学习笔记(三)—— V层相关学习_第32张图片
      Snip20190706_140.png

      可以看出有效期和值都变了

    • 解码查看值:
      Snip20190706_141.png
    • 调用get_session方法:
      django学习笔记(三)—— V层相关学习_第33张图片
      还是未设置cookie.png

      session.get()方法也用错。

    • 修改get视图:
      django学习笔记(三)—— V层相关学习_第34张图片
      Snip20190706_145.png
    • 重新调用:
      django学习笔记(三)—— V层相关学习_第35张图片
      Snip20190706_146.png
    • 调整del方法:
      django学习笔记(三)—— V层相关学习_第36张图片
      调整del_session视图.png
    • 重新调用:
      django学习笔记(三)—— V层相关学习_第37张图片
      Snip20190706_148.png
    • 查询数据库:
      删除session后.png
    • 解析数据:
      删除session后.png

      可以看出每次更新session值,过期时间都要更新至默认两周后。

    • 设置过期时间:
      django学习笔记(三)—— V层相关学习_第38张图片
      设置过期时间后查询数据库.png
    • 调用后:
      django学习笔记(三)—— V层相关学习_第39张图片
      设置过期时间成功.png
    • 查询数据库:
      设置过期时间后数据库.png
    • 再次调用get:
      django学习笔记(三)—— V层相关学习_第40张图片
      超时后查询session.png
    • 再次调用set:
      django学习笔记(三)—— V层相关学习_第41张图片
      再次设置session.png
    • 查询数据库:
      查询数据库.png
    • 通过cookie设置过期:
      django学习笔记(三)—— V层相关学习_第42张图片
      修改cookie过期视图.png
    • 调用后查询数据库:
      修改cookie后查询数据库.png
    • 等待过期后调用get:
      django学习笔记(三)—— V层相关学习_第43张图片
      cookie过期后查看.png

      可以看出,通过session设置过期时间和通过cookie设置过期处理方式不同。

      • cookie:通过cookie设置是修改了浏览器cookie的过期时间,数据库中session还在而且过期时间不变(可能成为死数据);
      • session:通过session设置不仅修改数据库的session过期值,而且会把浏览器的cookie过期也同时修改。
    • 测试clear,先调用set后查询数据库:
      设置cookie.png
    • 调用get:
      django学习笔记(三)—— V层相关学习_第44张图片
      get_session.png
    • 调用clear后:
      django学习笔记(三)—— V层相关学习_第45张图片
      调用clear结果.png
    • 查询数据库:
      clear后查询数据库.png
    • 解析:
      django学习笔记(三)—— V层相关学习_第46张图片
      Snip20190706_166.png
  • 使用redis存储session:
      1. 安装依赖包:pip install django-redis-sessions==0.5.6
      1. settings.py增加如下配置:
        django学习笔记(三)—— V层相关学习_第47张图片
        redis配置.png
      1. 调用set_session方法:
        django学习笔记(三)—— V层相关学习_第48张图片
        设置session.png

        修改redis所在服务器redis配置文件,修改protected-mode为no:
        django学习笔记(三)—— V层相关学习_第49张图片
        修改配置文件.png
        再次访问:
        django学习笔记(三)—— V层相关学习_第50张图片
        拒绝连接.png
        再次修改配置文件,注释掉绑定本地:
        django学习笔记(三)—— V层相关学习_第51张图片
        修改配置.png
        django学习笔记(三)—— V层相关学习_第52张图片
        设置成功.png
      1. 查询数据库:
        django学习笔记(三)—— V层相关学习_第53张图片
        Snip20190709_176.png

你可能感兴趣的:(django学习笔记(三)—— V层相关学习)