当前位置: 首页 > news >正文

【django进阶知识点】

day04 django进阶知识点

今日概要:

  • 模板
  • 中间件
  • ORM操作(pymysql + SQL语句)
  • session和cookie
  • 缓存(很多种方式)

内容回顾

  • 请求周期

    • 路由系统

      • 最基本路由关系
      • 动态路由(含正则)
      • 路由分发不同的app中 + include + 本质 + name + namespace
    • 视图

      • 类和函数(FBV和CBV)

      • 参数 request

        • 请求数据
        • 自定义数据
      • 响应

        HttpResponse/JsonResponse/render/redirect
        return HttpResponse("...")响应头
        obj = HttpResponse("...")
        obj['xxxxx'] = "值"
        return obj
        
  • 其他知识

    • 虚拟环境

    • 纯净版项目,内置app功能去掉。

    • 多app,嵌套到apps目录。

    • pycharm创建django项目 + 虚拟环境

      • 最新的django项目
      • 低版本(环境+项目+django文件模板)
    • settings配置

      django默认settings [先加载] 500
      项目目录settings    [后加载] 20
      
    • 静态资源

      • 静态文件,项目必备【项目根目录,每个app目录下static - app注册顺序】
      • 媒体文件,用户上传

1.模板

1.1 寻找html模板

TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, 'templates')],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request',# 'django.contrib.auth.context_processors.auth',# 'django.contrib.messages.context_processors.messages',],},},
]

优先去项目根目录 > 每个已注册的app的templates目录找。

如何选择:

  • 简单的项目,模板都放在根目录。
  • 复杂的项目,模板放在各自的app中,公共部分放在templates目录。

扩展:修改内置app的模板也是同样的套路。

1.2 模板处理的本质

渲染完成后,生成了字符串,再返回给浏览器。

在这里插入图片描述

在这里插入图片描述

1.3 常用语法

在这里插入图片描述

1.4 内置函数

在django模板语法中提供了内置函数让我们来。

在这里插入图片描述

1.5 自定义模板功能

在这里插入图片描述

三种方式:

  • filter

    - 数据处理,参数:1~2个
    - 数据处理,if条件
    
  • simple_tag

    参数无限制 & 返回文本
    
  • inclusion_tag

    参数无限制 & HTML片段
    

需求来了:根据用户权限不同显示不同的菜单。

在这里插入图片描述

1.6 继承和母版

在这里插入图片描述

在这里插入图片描述

1.7 模板的导入

在这里插入图片描述

2.django中间件

在这里插入图片描述

  • 定义方法
  • 注册

2.1 原始方式

在这里插入图片描述

在这里插入图片描述

2.2 MiddlewareMixin(建议)

在这里插入图片描述

在这里插入图片描述

注意:django1版本。

源码:

  • 面向对象

    class MyMd(object):def __init__(self....):passdef __call__(self,....):passdjango内部默认执行call方法,传入参数。
    
  • 反射

    class MyMd(object):def __init__(self....):passdef __call__(self,....):if hasattr(self,'process_request'):response = self.process_request(request)...django内部默认执行call方法,传入参数。
    
    class MiddlewareMixin:def __init__(self, get_response=None):self.get_response = get_responsedef __call__(self, request):response = Noneif hasattr(self, 'process_request'):response = self.process_request(request)response = response or self.get_response(request)if hasattr(self, 'process_response'):response = self.process_response(request, response)return responseclass MyMd(MiddlewareMixin):def process_request(self,request):...def process_response(self,request, response):...django内部默认执行call方法,传入参数。
    

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

疑问:prcess_request的执行时,是否已执行了路由匹配?

request.resolver_match

注意:process_view是在django中源码中写死了。

在这里插入图片描述

2.3 其他

在这里插入图片描述

在这里插入图片描述

小结

  • 定义中间类
  • 类方法
    • process_request
    • process_view
    • process_reponse
    • process_exception,视图函数出现异常,自定义异常页面。
    • process_template_response,视图函数返回TemplateResponse对象 or 对象中含有.render方法。

在这里插入图片描述

3.ORM操作

orm,关系对象映射,本质翻译的。

在这里插入图片描述

3.1 表结构

实现:创建表、修改表、删除表。

在app中的models.py中按照规则编写类 ===> 表结构。

  • 编写类

    from django.db import modelsclass UserInfo(models.Model):name = models.CharField(max_length=16)age = models.IntegerField()
    
  • 注册app

    INSTALLED_APPS = [# 'django.contrib.admin',# 'django.contrib.auth',# 'django.contrib.contenttypes',# 'django.contrib.sessions',# 'django.contrib.messages','django.contrib.staticfiles','apps.app01.apps.App01Config','apps.app02.apps.App02Config',
    ]
    
  • 命令,django根据models中类生成一个 对数据库操作的配置文件 => migrations

    python manage.py makemigrations
    

    在这里插入图片描述

  • 命令,读取已经注册么给app中的migrations目录将配置文件 -> 转换成:生成表,修改表 SQL -> 连接数据库去运行。

    python manage.py migrate
    
    • 那个数据库?
    • 数据库账户和密码?
    DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': os.path.join(BASE_DIR, 'db.sqlite3'),}
    }
    

    在这里插入图片描述

常见问题:请不要再手动去修改数据的表结构 + 时刻保证 ORM和数据表是对应。

3.1.1 常见字段和参数
  • 字段

    CharFieldSmallIntegerField
    IntegerField
    BigIntegerFieldDateField
    DateTimeFieldBooleanField  -> 其实数据库不支持真假,根据SmallIntegerField创造出来出来。 0  1DecimalField  -> 精确的小数
    
  • 参数

    name = models.CharField(verbose_name="姓名", max_length=16)
    name = models.CharField(verbose_name="姓名", max_length=16, default="哈哈哈")# 经常查询,速度快(MySQL,https://www.bilibili.com/video/BV15R4y1b7y9)
    name = models.CharField(verbose_name="姓名", max_length=16, default="哈哈哈", null=True, blank=True, db_index=True)
    email = models.CharField(verbose_name="姓名", max_length=16, default="哈哈哈", null=True, blank=True, unique=True)# 在数据库存储时只能是:sh、bj (上海、北京一般用于页面显示中文)
    code = models.CharField(verbose_name="姓名", max_length=16, choices=(("sh", "上海"), ("bj", "北京")),default="sh")
    
    # 不用 max_length=16
    count = models.IntegerField(verbose_name="数量", default=1, null=True, blank=True, unique=True)
    code = models.IntegerField(verbose_name="性别",choices=((1, "男"), (2, "女")),default=1)
    
    register_date = models.DateField(verbose_name="注册时间", auto_now=True)
    
    amount = models.DecimalField(verbose_name="余额", max_digits=10, decimal_places=2)
    

示例:

from django.db import modelsclass UserInfo(models.Model):name = models.CharField(verbose_name="姓名", max_length=16, db_index=True)age = models.PositiveIntegerField(verbose_name="年龄")email = models.CharField(verbose_name="邮箱", max_length=128, unique=True)amount = models.DecimalField(verbose_name="余额", max_digits=10, decimal_places=2, default=0)register_date = models.DateField(verbose_name="注册时间", auto_now=True)class Goods(models.Model):title = models.CharField(verbose_name="标题", max_length=32)# detail = models.CharField(verbose_name="详细信息", max_length=255)detail = models.TextField(verbose_name="详细信息")price = models.PositiveIntegerField(verbose_name="价格")count = models.PositiveBigIntegerField(verbose_name="库存", default=0)
3.1.2 表关系

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

注意:ManyToManyField生成的表字段只能id/bid/gid

小结

设计自己项目的业务时,理清楚表与表之间的关系。

强调:设计项目表结构:表名和字段都不要拼音。

3.2 数据

实现:增删改查。

任务

  • 知识点
  • 自己的项目设计表结构,自己设计。
    • 项目功能描述
    • 表结构
      • 设计图(提交)
      • ORM类(主要)

提交形式:zip包 -> markdown编写。


下节预告:orm数据操作、cookie和session、缓存、刷票平台(表结构设计)、用户管理、用户+权限菜单

http://www.mrgr.cn/news/5941.html

相关文章:

  • Frida实战:枚举模块、导入表、导出表与符号表
  • 结构型模式之组合模式
  • YOLOv10:实时端到端目标检测
  • IDM下载器怎么提速 IDM下载速度慢解决办法 idm下载器设置怎么下载最快
  • git打包某个分支的特定提交
  • 【SpringBoot】开发常见注解
  • RabbitMQ中如何通过死信交换机实现延时队列
  • MFC使用双缓冲实现绘制字符串防闪烁
  • 书生大模型实战营第三期基础岛第二课——8G 显存玩转书生大模型 Demo
  • 8.21面试复盘
  • 彻底解决win7系统文件夹选项高级设置是空白
  • 在Ubuntu 部署 Grafana且监控MySQL数据
  • Spring中策略模式模拟优惠券使用,解耦代码!
  • 监听MySQL binlog
  • 酷家乐 同盾滑块分析
  • ISO7841标准数字隔离器在现代电子系统中的作用
  • 2024最新50道NLP和人工智能领域面试题+答案(中文+英文双版本)
  • linux基础命令(超级详细)
  • oracle的dataguard physical standby转 snapshot standby操作文档
  • react 的学习随记