Django项目方法 工具类总结(完善中)

  1. 用户相关
    • 创建用户
      • User.objects.create_user(username=usernam………)
      • create_user 会自动将密码进行加密
    • 用户验证
      • user = authenticate(username=username, password=password)
        • 返回布尔类型的数据
    • 校验密码是否正确
      • request.user.check_password(old_password)
    • 修改密码并加密
      • request.user.set_password(password)
    • 首页展示用户名,3种方法
      1. 模板中request变量直接渲染用户名
        • 缺点: 不方便做首页静态化
      2. 单独定义借口,发送ajax请求
        • 缺点: 需要发送网络请求
      3. 使用cookie保存用户信息,前端访问cookie
        • 优点: 减少网络访问,方便首页静态化
        • 代码参考状态保持
    • 判断用户是否登录
      • is_authenticate
        • 很多地方都需要,该判断逻辑需要重复编码好多次
      • login_required装饰器
        • 已经封装了is_authenticate
        • 配置中定义,用户未登录跳转的路径: LOGIN_URL=‘/login/’
        • 用法:
          • 直接路由中装饰as_view(),但是不好
          • 重写as_view()
            • 定义工具类文件utils.py
            • 添加扩展类
            • class LoginRequiredMixin(object):
            • “”“验证用户是否登录的扩展类”""
            • @classmethod
            • def as_view(cls, **initkwargs):
            •   # 调用父类的 as_view() 函数
              
            •   view = super().as_view()
              
            •   return login_required(view)
              
          • 验证是否登录时,直接继承拓展类工具即可
            • class UserInfo(LoginRequiredMixin,request)
              • pass
  2. 重定向
    • return redirect(reverse(‘contents:index’))
  3. 状态保持
    • login(request,user) # 自动保存到 session中,将sessionid保存到cookie中
    • login()会自动将 session 保存到 cookie 中
      • 设置 session的时效,request.session.set_expiry(0)
      • 设置 cookie, response.set_cookie(‘username’,username) #为了前端获取用户名
      • 前端获取 cookie
    • logout(request) # 自动清理 session
      • response = redirect.reverse(content:index)
      • response.delete_cookie('username’) # 清楚cookie的信息
      • return response
  4. 密码相关
    • 设置 cookie
      • HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
    • 修改密码并对密码加密
  5. 扩展类的写法
    • def login_required_json(view)
      • @wraps(view) # 恢复被装饰函数的文档和名字
      • def wrapper(request)
        • if request.user.is_authenticated():
          • return http.JsonResponse({})
        • else:
          • return view()
        • return view()
      • return wrapper
    • class LoginRequiredJsonMixin(object)
      • @class method
      • def as_view(cls)
        • view = super().as_view()
        • return login_request_json(view) # 使用 login_request_json 过滤 view
  6. 过滤器
  7. wraps 装饰器
    • 作用:恢复被装饰函数的文档和名字
  8. 启动 celery
    • celery -A celery_tasks.main worker -l info
  9. models & 数据库
    • 模型类相关
      • 过滤查询 属性名称__比较运算符=值
      • 查询运算符:exact contains startwith endswith isnull in 比较(gt gte it ite)
      • 一到多的查询
        • b = BookInfo.objects.get(id=1)
        • b.heroinfo_set.all( ) # 多的模型类要小写
        • 如果在hbook( 是HeroInfo中的外键,对应BookInfo)中加入外键heros,也可以写成
          • b.heros.all( )
      • 多到一的查询
        • h = HeroInfo.objects.get(id=1)
        • h.book # 查询书的名字
        • 访问关联对象的id 语法 : h.hbook_id
      • 关联过滤查询
        • 多模型条件查询一模型类数据
          • 查询图书,要求英雄为杨过
            • BookInfo.objects.filter(heroinfo__hname=‘杨过’)
        • 一模型类条件查询多模型类数据:通过外键查找
          • 查询天龙八部的所有英雄
            • HeroInfo.objects.filter(hbook__btitle=‘天龙八部’)
        • 111
        • 11111
        • 11111
    • 外键
      • 外键是指别的表的 id,会自动加上 “_id”
      • 外键取别名
        • relate_name=“subs"
          • 起别名,代表外键的反向使用
    • 更新数据
      • Address.objects.filter(id=address_id).update()
      • request.user.default_address = id 为何会报错
    • 创建数据
      • address = Address.objects.create()
    • 对结果添加过滤
      • request.user.model.objects.filter(id=1).count()
  10. 缓存功能
    • from django.core.cache import cache
    • 设置缓存
      • cache.set(‘province_list’,province,有效期)
    • 获取缓存
      • province = cache.get(‘province_list’)
      • if not province:
        • 再去数据库取值
  11. post接收 json格式数据
    • json_dict = json.loads(request.body.decode())
    • name = json_dict.get(‘name’)
  12. 分页器
    1. page_num = int(page_num) # 第几页,必须是整型
    2. try:
    3. paginator = Paginator(orders, 2)  # 商品列表,每页商品数 
      
    4. page_orders = paginator.page(page_num)
      
    5. total_page = paginator.num_pages
      
    6. except EmptyPage:
    7. return http.HttpResponseNotFound('订单不存在')
      
  13. Elasticsearch全文检索方案
    • 在搜索之前,搜搜引擎提前检索数据库,建立起索引
    • 搜索引擎对数据构建索引时,需要进行分词处理,将一句户拆解成多个单词或词,这个词就是这句话的关键
  14. 事物
    • with transaction.atomic()
      • save_id = transaction.savepoint( )
      • try:
        • ……
      • Exception:
        • transaction.savepoint_rollback(save_point)
      • transaction.savepoint_commit(save_id)

你可能感兴趣的:(知识总结)