内容回顾:

多对多

 class Pulisher(models.Model):
  name = models.CharField(max_length=32)
 ​
 class Book(models.Model):
  name = models.CharField(max_length=32)
     pub = models.ForeignKey('Pulisher',on_delete=models.DO_NOTHING)
 ​
 class Author(models.Model):
  name = models.CharField(max_length=32)
  books= models.ManyToManyField(to='Book')
 # 查询
 book_obj.pub   # 所关联的对象   book_obj.pub_id 所关联的对象的id
 ​
 author_obj.books  # 关系管理对象
 author_obj.books.all()   # 所关联的所有的书籍对象
 # 新增
 Book.objects.create(name='xxx',pub=对象)
 Book.objects.create(name='xxx',pub_id=对象的ID)
 ​
 obj= Book(name='xxx',pub_id=对象的ID)
 obj.save()
 ​
 obj = Author.objects.create(name='xxx')
 obj.books.set([书籍id,书籍id])
 # 删除
 Book.objects.filter(pk=pk).delete()  # QuerySet 删除
 Author.objects.get(pk=pk).delete()  # 对象 删除
 # 编辑
 Book.objects.filter(pk=pk).update(name='xxx')
 ​
 book_obj.name ='xxxx'
 book_obj.save()
 ​
 Author.objects.filter(pk=pk).update(name='xxx')
 author_obj.books.set([id,id])

cookie

定义:

保存在浏览器上的一组组键值对

为什么要有cookie?

http协议是无状态,每次请求都是相互独立,没有办法保存状态.用cookie保存状态.

cookie的特点:

  1. 由服务器让浏览器进行设置的

  2. 浏览器保存在本地的

  3. 下次访问时自动携带对应的cookie

Django中操作cookie的方法:

  1. 设置

    响应头: set-cookie : key=value

     response.set_cookie(key,value,max_age=5,path='/')
     response.set_signed_cookie(key,value,salt='xxxx',max_age=5,path='/')
  2. 获取

    请求头: cookie

     request.COOKIES # {}
     request.COOKIES.get(key)
     ​
     request.get_signed_cookie(key,salt='xxxx',default='')
  3. 删除

     response.delete_cookie(key)  

装饰器:

 from functools import wraps
 ​
 def wrapper(func):
     @wraps(func)  # 复制了原来函数的名字和注释
  def inner(request,*arg,**kwargs):
         # 之前
         ret = func(request,*arg,**kwargs)
         # 之后
         return ret
     return inner
 ​
 @wrapper  # f1 = wrapper(f1)
 def f1(request):
     pass
 ​
 f1.__name__  # inner _> f1  
 ​

response:

 from django.shortcuts import render, redirect, HttpResponse
 HttpResponse()
 render()
 redirect()

session

定义:保存在服务器上的一组组键值对,必须依赖cookie

为什么要有session?

  1. cookie保存在浏览器上,不太安全

  2. cookie的大小和个数有限制

Django中操作session

设置:

 request.session[key] = value 

获取

 request.session[key]
 request.session.get(key)

删除:

 request.session.pop('is_login')
 request.session.delete() # 删除所有的session数据
 request.session.flush()   # 删除所有的session数据和cookie

其他:

 request.session.clear_expired()
 request.session.set_expiry(value)  

配置:

 from django.conf import global_settings
 ​
 SESSION_COOKIE_NAME = 'session'   # cookie的名字
 SESSION_SAVE_EVERY_REQUEST = True # 每次请求都更新session
 SESSION_EXPIRE_AT_BROWSER_CLOSE = True # 浏览器关闭session就失效
 ​
 SESSION_ENGINE = 'django.contrib.sessions.backends.db'
 from django.contrib.sessions.backends import db
 # 数据库 缓存 缓存+数据库 文件 加密cookie

正则表达式

^ $ [0-9] [a-zA-Z] [asd]{4,6} +(一个或多个) *(0个或多个) ? (0个或1个)

\d \w .(除了换行符之外的任意字符)

分组:

 url(r'^del_publisher/(\d+)/', views.del_publisher),
 ​
 分组后从url中捕获参数,捕获的参数会按照 位置传参 传递给函数

命名分组

 url(r'^del_publisher/(?P<pk>\d+)/', views.del_publisher),
 ​
 分组后从url中捕获参数,捕获的参数会按照 关键字传参 传递给函数
 ​

url的命名和反向解析

命名:

 url(r'^login/', views.login,name='login'),

反向解析:

模板:

 {% url 'login' %}   -> "/app01/login/"  # 反向解析生成一个可以访问的地址

py文件:

 from django.urls import  reverse
 reverse('login')   ——》 "/app01/login/" # 反向解析生成一个可以访问的地址

分组

 url(r'^blog/([0-9]{4})/(\d{2})/$', views.blog,name='blog'),

模板:

 {% url 'blog' 2020 10  %}  ——》 ‘/app01/blog/2020/10/’

py文件:

 reverse('blog',args=['2019','10']  ——》 ‘/app01/blog/2020/10/’

命令分组

 url(r'^blog/(?P<year>[0-9]{4})/(?P<month>\d{2})/$', views.blog,name='blog'),

模板:

 {% url 'blog' 2020 10  %}  ——》 ‘/app01/blog/2020/10/’
 {% url 'blog' month=10 year=2019 %} ——》 ‘/app01/blog/2020/10/’

py文件:

 reverse('blog',args=['2019','10']  ——》 ‘/app01/blog/2020/10/’
 reverse('blog',kwargs={'year':'2019','month':'10'}) ——》 ‘/app01/blog/2020/10/’

namespace:

 url(r'^app01/', include('app01.urls',namespace='app01')),
 url(r'^app02/', include('app02.urls',namespace='app02')),
 {%  url 'namespace:name'  %}
 reverse('namespace:name')

最新文章

  1. Spring 01基础
  2. ComboBox,三级联动菜单,新入门点小白,有些代码有待优化,大神勿喷
  3. P2P的理解
  4. 每日一练(写不出心得体会了!毕竟哪有那么多心得好写。然后看github上有很多不错的题目。分享一下!)
  5. 入侵检测课设之Libnids开发包
  6. 机器学习中的范数规则化之(一)L0、L1与L2范数 非常好,必看
  7. (转载)通过dbgrideh 从数据集中选择合适的记录
  8. checkbox操作
  9. 使用SQL语句创建和删除约束
  10. SCSI磁盘标准的架构与文档
  11. U7Linux文件与目录管理
  12. 播放视频的框架Vitamio的使用问题
  13. c# socket传输struct类型
  14. linux下如何查看mysql、apache是否安装,并卸载
  15. 利用shell脚本监控目录内文件改动
  16. mitm6:通过IPv6攻破IPv4网络
  17. poj1011 && uva307 DFS + 剪枝
  18. UVA11107 Life Forms
  19. Advertising.csv
  20. ContentProvider工作原理

热门文章

  1. 对java的几点个人浅浅的认知
  2. AcWing&#160;46.&#160;二叉搜索树的后序遍历序列
  3. Sigma Function (LightOJ - 1336)【简单数论】【算术基本定理】【思维】
  4. Noip2016Day2T3 愤怒的小鸟
  5. json解析模块
  6. Win32 程序开发入门:一个最简单的Win32程序
  7. ubuntu 16.04无法连接网络;双系统无法上网;连接已断开,你现在处于断开状态
  8. Redis for OPS 07:Redis 补充说明
  9. 30段极简Python代码:这些小技巧你都Get了么
  10. Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战