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<bookid>\d+)$', views.detais)

2.2 内置错误视图

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

2.3 HttpRequest对象

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

  • 属性(除非特殊说明,否则属性都是只读的):
    1. path:完整请求路径,不包含域名和请求参数;
    1. method:请求方法,常用的有'GET'和'POST';
    1. encoding:提交数据的编码方式,None表示使用浏览器默认编码方式,一般为utf8。注意这是一个可写属性,修改后对属性的接收使用的是新的编码方式:
      utf8编码接收参数.png
      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():向响应体中写数据;
      设置response.png
2.4.1 子类JsonResponse

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

  • 添加jquery文件:
    添加jquery文件.png
  • 配置静态文件查找目录:
    配置静态文件加载目录.png
  • 配置url,定义视图
  • 定义页面:
    页面.png
  • 视图:
    jsonresponse视图.png
  • 效果:
    json效果.png
  • 交互过程:
    json交互过程.png
2.4.2 子类HttpResponseRedirect

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

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;
      获取和设置cookie视图.png
      设置cookie前访问
      设置cookie.png
      设置cookie后获取cookie.png

3.2 session

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

  • django默认开启session,在settings.pyMIDDLE_WARE CLASSES中通过中间件开启。如果禁用,则将session中间件删除即可:
    默认通过中间件开启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应用(默认已有):
    包含session应用.png
    迁移生成的session表.png
    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
    • 解析发现里面值为空:
      解析session值.png
    • 测试del方法:
      删除session视图.png
    • 第一次调用:
      del方法删除session.png

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

    • 测试session.flush()方法:
      flush视图.png

      flush删除成功.png
    • 此时查看session值:
      获取session视图.png
      没有设置session.png
    • 设置session,先调用set_session:
      定义两个设置session方法.png
      set_session响应.png
    • 查看数据库:
      Snip20190706_137.png

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

    • 解码查看session值:
      解析查看session值.png
    • 调用set_session2设置:
      第二次设置session响应.png
    • 再次查看数据库:
      Snip20190706_140.png

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

    • 解码查看值:
      Snip20190706_141.png
    • 调用get_session方法:
      还是未设置cookie.png

      session.get()方法也用错。

    • 修改get视图:
      Snip20190706_145.png
    • 重新调用:
      Snip20190706_146.png
    • 调整del方法:
      调整del_session视图.png
    • 重新调用:
      Snip20190706_148.png
    • 查询数据库:
      删除session后.png
    • 解析数据:
      删除session后.png

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

    • 设置过期时间:
      设置过期时间后查询数据库.png
    • 调用后:
      设置过期时间成功.png
    • 查询数据库:
      设置过期时间后数据库.png
    • 再次调用get:
      超时后查询session.png
    • 再次调用set:
      再次设置session.png
    • 查询数据库:
      查询数据库.png
    • 通过cookie设置过期:
      修改cookie过期视图.png
    • 调用后查询数据库:
      修改cookie后查询数据库.png
    • 等待过期后调用get:
      cookie过期后查看.png

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

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

        修改redis所在服务器redis配置文件,修改protected-mode为no:
        修改配置文件.png
        再次访问:
        拒绝连接.png
        再次修改配置文件,注释掉绑定本地:
        修改配置.png
        设置成功.png
      1. 查询数据库:
        Snip20190709_176.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,096评论 1 32
  • 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Se...
    chinariver阅读 5,613评论 1 49
  • 点我查看本文集的说明及目录。 本项目相关内容包括: 实现过程: CH7 创建在线商店 CH8 管理支付和订单 CH...
    学以致用123阅读 3,566评论 0 6
  • 仰望心中的天空,不要迷失在所有人都看得见的桃花源中,永远低头走路,抬头察世
    李亦你好阅读 173评论 0 0
  • 在秋意中感受你的欢乐 骄傲的捧出你的快乐 生命就像是一朵鲜花 便造就了整个世界的希望
    Bill1007阅读 295评论 0 3