zoukankan      html  css  js  c++  java
  • session:

    内容回顾:

    多对多

     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')
  • 相关阅读:
    前端总结数据结构与算法基础
    Linux 常用命令
    mariadb下载二进制包源码包地址(使用清华)
    centos7添加永久静态路由
    登录普通用户会报错-bash: ulimit: open files: cannot modify limit: Operation not permitted
    编写二进制安装mariadb10.2的ansible-playbook剧本
    su
    URL后面加不加“/”有区别吗?
    RocketMQ在面试中那些常见问题及答案+汇总
    通过实现网站访问计数器带你理解 轻量级锁CAS原理,还学不会算我输!!!
  • 原文地址:https://www.cnblogs.com/zhang-da/p/12055684.html
Copyright © 2011-2022 走看看