web框架:Django进阶(一)

news2024/11/14 20:51:04

文章目录

  • django进阶
    • 内容回顾
    • 1.模板
      • 1.1 寻找html模板顺序
      • ==1.2 模板处理的本质==
      • 1.3 常用语法
      • 1.4 内置函数
      • 1.5 自定义模板功能
      • 1.6 继承和母版
      • 1.7 模板的导入
    • 2.django中间件
      • 2.1 原始方式
      • ==2.2 MiddlewareMixin(建议)==
      • 2.3 prcess_request的执行时,是否已执行了路由匹配?
      • 2.4 process_view
        • process_request和process_view
      • 2.5 其他
      • 小结
    • 3.ORM操作
      • 3.1 表结构
        • 3.1.1 常见字段和参数
        • 3.1.2 表关系

django进阶

  • 模板
  • 中间件
  • ORM操作(pymysql + SQL语句) 内部会转化为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中,更有利于组件化

如果不要求组件化,完全可以在根目录的templates分类存放

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

如果想修改django内置app的模板,可以在templates下创建内置app名称的文件夹。

1.2 模板处理的本质

一定是django在将html渲染完成之后(占位符替换后),才将完整的文本信息返回给浏览器的

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

在这里插入图片描述

如果将js代码单独放入文件,就不会替换了。

如果通过导入js文件的形式:浏览器在发现js语句后会再向服务端发送一个请求来单独获取js文件,而此时js文件在static文件夹下,就直接通过static系统直接发送给浏览器了,不需要经过路由系统了。所以此时js文件中的字符串没有被渲染。

以下是浏览器处理 JavaScript 文件的一般流程:

  1. HTML解析

    • 浏览器首先解析 HTML 文档,当遇到 <script> 标签时,会根据标签中的 src 属性确定 JavaScript 文件的位置。
  2. 发送请求获取JS文件

    • 如果 <script> 标签包含 src 属性,浏览器会向该 URL 发送一个 HTTP 请求,请求获取 JavaScript 文件。这个 URL 可以是相对路径或绝对路径。
  3. 静态文件服务

    • 如果 JavaScript 文件位于 Django 的 STATIC_URL 指定的静态文件目录中,Django 的静态文件服务会处理这个请求。这意味着浏览器会直接从静态文件目录获取 JavaScript 文件,而不需要经过 Django 的视图系统。
  4. 渲染JavaScript代码

    • 浏览器接收到 JavaScript 文件后,会执行其中的代码。如果 JavaScript 文件中包含字符串需要渲染,这些字符串需要在发送请求之前就处理好。
  5. 模板渲染

    • 如果 JavaScript 文件中的字符串需要动态渲染(例如,包含变量或模板标签),这些字符串必须在服务器端的模板渲染过程中处理。这意味着 JavaScript 文件应该作为模板的一部分,通过 Django 的模板系统进行渲染。
  6. 模板标签

    • 在 Django 模板中,可以通过 {% static %} 模板标签引入静态文件的 URL。这样可以确保 URL 是正确的,并且可以处理模板中的变量。
  7. 缓存处理

    • 浏览器和服务器可能会对静态文件进行缓存处理,减少重复的请求和提高加载速度。

总结来说,你的理解是正确的:当 JavaScript 文件通过 <script src="..."> 标签引入时,浏览器会直接从静态文件服务获取文件,而不是通过 Django 的视图系统。因此,文件中的字符串不会通过 Django 的模板系统进行渲染。如果需要动态渲染这些字符串,需要在服务器端的模板渲染过程中处理。

在这里插入图片描述

1.3 常用语法

在这里插入图片描述

1.4 内置函数

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

在这里插入图片描述

1.5 自定义模板功能

自定义模板函数:

  1. 创建templatetags文件夹,并创建一个py文件,并自定义模板函数

    1. filter

      多适用于数据处理,1到2个参数,if判断

      定义:@register.filter

      使用:通过==管道符|==使用:{{ ‘string’|myfunc }}

    2. simple_tag

      多适用于文本展示,参数无限制 & 返回文本信息

      定义:@register.simple_tag

      使用:通过类似加载static的url的方式{% mytag 'arg1' 'arg2' 'arg3' %}

    3. inclusion_tag

      多适用于html片段展示,参数无限制 & 返回html片段

      定义:@register.inclusion_tag(“app01/xxxx.html”)

      返回的是已经渲染完成的html片段

      使用:通过类似加载static的url的方式{% mytag 'arg1' 'arg2' 'arg3' %}

  2. 在模板文件中{% load xx %}导入文件

  3. 使用函数

在这里插入图片描述

三种方式:

  • filter

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

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

    参数无限制 & HTML片段
    

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

在这里插入图片描述

1.6 继承和母版

  1. 如果有extends继承的话,先加载母版,将block替换掉,得到整体的原始文本
  2. 第二步再进行渲染(替换字符串),所以母版中的占位符字符串也会被替换

母版中至少要包含:

  • html:{% block body %}{% endblock %}
  • css:{% block css %}{% endblock %}
  • js:{% block js %}{% endblock %}

在这里插入图片描述

在这里插入图片描述

1.7 模板的导入

可以通过include进行片段替换:{% include “app01/index.html” %}

  1. 如果有extends继承的话,先加载母版,将block替换掉,得到整体的原始文本
  2. 再找include,将未渲染的片段替换
  3. 进行渲染(替换字符串),所以母版中的占位符字符串也会被替换

在这里插入图片描述






2.django中间件

在这里插入图片描述

  • 定义方法
  • 注册

2.1 原始方式

在这里插入图片描述

在这里插入图片描述

2.2 MiddlewareMixin(建议)

源码实现

基于反射实现出来可以直接通过继承MiddlewareMixin类来定义中间件,

只需简单的定义process_request函数process_response函数,而无需再定义__call__方法。

  1. 第一个hasattr是对应请求中间件的,如果定义了process_request,
    就在view视图函数执行之前先执行process_request,process_request可以没有或者没有返回值,一般没有

    • 如果response为空(process_request没有返回值),response就是view函数的返回值;

    • 如果response为不为空(process_request有返回值),response就是process_request函数的返回值;

      此时,在执行response=response or self.get_response(request)时,就不会执行后面的函数了,

      包括之后注册的中间件函数,view视图函数,而是直接去执行该process_request对应的process_response函数,以及已经执行过process_request的中间件对应的process_response函数

      在这里插入图片描述

  1. 第二个hasattr是对应响应中间件的,如果定义了process_response,
    就在view视图函数执行之后先执行process_response。

    process_response一定要有返回值。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

注意:django1版本。

源码:

  • 面向对象

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

    class MyMd(object):
        def __init__(self....):
            pass
        
        def __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_response
            
        def __call__(self, request):
            response = None
            if 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 response
        
        
    class MyMd(MiddlewareMixin):
        
        def process_request(self,request):
            ...
        
        def process_response(self,request, response):
            ...
        
    django内部默认执行call方法,传入参数。
    

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.3 prcess_request的执行时,是否已执行了路由匹配?

没有

  1. 中间件中的request.reslover_match对象为空
  2. 视图函数中的request.reslover_match对象为路由匹配信息

在这里插入图片描述

request.resolver_match

2.4 process_view

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

路由匹配成功后,还要再轮流执行中间件中的process_view函数

如果process_view中有返回值,会跳过view视图函数,从最后一个中间件的process_response函数轮流执行。

在这里插入图片描述

process_request和process_view
  • 为什么有了process_request还要有process_view呢?

    process_request和process_view的区别是:一个没有匹配路由,一个已经匹配路由

    process_request(没有匹配路由):可以用做一些所有路由都要做的流程

    process_view(已经匹配路由):可以做一些特定的路由要做的流程

2.5 其他

  • process_exception

    视图函数异常,process_exception会捕获异常,也可以返回响应

    在这里插入图片描述

    在这里插入图片描述

  • process_template_response(了解即可)

    只有在视图函数返回TemplateResponse对象时,才会触发中间件中的process_template_response方法,该方法内部时间上会调用render()方法。

    所以说process_template_response这种方法实际上就是:

    将视图函数直接返回render()分为了两步

    1. 返回TemplateResponse对象
    2. process_template_response函数中调用render()方法

    在这里插入图片描述

    在这里插入图片描述

python面向对象中__call__方法

小结

  • 定义中间类

  • 类方法

    • 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 models
    
    
    class 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 常见字段和参数
  • 字段

    CharField
    
    SmallIntegerField
    IntegerField
    positiveIntegerField(无符号)
    BigIntegerField
    
    DateField
    DateTimeField
    
    BooleanField  -> 其实数据库不支持真假,根据SmallIntegerField创造出来出来。 0  1
    
    DecimalField  -> 精确的小数
    
  • 参数

    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 models


class 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


若有错误与不足请指出,关注DPT一起进步吧!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1966621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【系统设计】软件项目概要设计说明书(2024原件完整版)

1引言 1.1编写目的 1.2项目背景 1.3参考资料 2系统总体设计 2.1整体架构 2.2整体功能架构 2.3整体技术架构 2.4运行环境设计 2.5设计目标 3系统功能模块设计 3.1个人办公 3.2系统管理 4性能设计 4.1响应时间 4.2并发用户数 5接口设计 5.1接口设计原则 5.2接口实现方式 6运行设计…

qiankun 微前端 隔离子应用样式,解决 ant-design-vue 子应用样式污染问题(已落地)

样式冲突产生原因 先分析乾坤qiankun 构建之后&#xff0c;会根据你的配置 给每个子应用生成一个id&#xff0c; 当加载到对应子应用的时候&#xff0c;就把内容放到对应的id 标签里去&#xff0c; 这样能有效的隔离 js 代码&#xff0c;但是样式是加载在全局的 所以 当两个子…

【CSS】分享个纯CSS实现去除白底图效果的小技巧

效果 原理 技巧来源&#xff1a;Amazon的产品列表页 通过底色与遮罩层的透明度搭配实现&#xff0c;整体的"去白底"效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"view…

实施数据治理的十大优势

关注公众号网络研究观获取更多内容。 数据治理不仅仅是一个流行词&#xff0c;也是强大数据管理策略的基础要素。通过实施结构化数据治理&#xff0c;组织可以获得显著的好处&#xff0c;从而提高效率、合规性和决策能力。 本博客探讨了数据治理的最大优势&#xff0c;详细介…

android13禁止应用卸载功能 禁止卸载包名 安卓禁止卸载应用

总纲 android13 rom 开发总纲说明 目录 1.前言 2.情况分析 3.代码修改 4.编译运行 5.写在最后 6.彩蛋 1.前言 Android 13增加禁止卸载对应包名的应用,这一功能主要是为了增强系统的安全性和稳定性。通过禁止用户卸载某些预装应用,防止这些应用被误删或恶意卸载,从而…

详细记录swfit微调interVL2-8B多模态大模型进行目标检测(附代码)

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 RAGOnMedicalKG&#xff1a;大模型结合知识图谱的RAG实现DSPy&#xff1a;变革式大模…

Python 线程的自修复

在 Python 中&#xff0c;线程的自修复通常涉及异常处理和适当的线程管理。在线程的 run() 方法中使用 try-except 块来捕获可能发生的异常。在捕获异常后&#xff0c;可以记录异常信息或者尝试重新启动线程以恢复正常运行。下面看看我最近的一个实操案例。 1、问题背景 我创建…

bugku.ctf ---WEB(还有后续)

bugku.ctf ---WEB 1.Simple_SSTI_1 1.启动场景 2. 页面说你需要输入一个名为flag的参数。 3.查看网页源代码&#xff0c;提示在flask中&#xff0c;设置了secret_key。意思是在注入模板中输入内容就会显示对应的值。 4.传入?flag{{config.SECRET_KEY}}显示flag 2.Simple_SST…

【Android】安卓多媒体之通知、摄像头、相册、播放音乐、视频用法总结

文章目录 一、通知1. 申请权限2. 创建通道3. 创建通知4. 发送通知拓展功能点击行为更新通知取消通知锁屏通知富文本通知 二、摄像头1. 申请权限2. 调用逻辑3. 声明内容提供器 三、打开相册1. 申请权限检查并请求权限处理权限请求结果 2.处理图片从相册中选择图片处理选择图片的…

反应力场lammps和reaxff,再加上智能计算模拟,你恐怕没见过这种绝妙组合

“第一性原理分子动力学机器学习”三位一体的综合手段&#xff0c;已经成为模拟计算的一个前沿方向&#xff0c;为解决传统计算化学方法面临的挑战提供了新的解决方案。国内外已有科研团队在深化第一性原理与分子动力学的研究与应用拓展&#xff0c;利用机器学习优化大规模计算…

yolov5训练的pt模型,转换为rknn并部署在瑞芯微RK3588开发板

一、下载源码 在GitHub中搜索并下载yolov5的源代码&#xff0c;然后放在自己部署好的项目环境。 直接用下面的命令即可部署适合yolov5的环境&#xff0c;至于缺什么库&#xff0c;什么版本不对的可以百度查一下。 pt模型转onnx模型 我这里已经把源码下载好并加载好了我的虚拟…

Redis CLI常用命令

Redis CLI常用命令 1. 设置和获取数据 SET Redis 中的数据是以键值对的形式存储的&#xff0c;所以需要指定一个键和一个值&#xff0c;键和值用空格隔开&#xff1b; Redis 中默认使用字符串存储数据&#xff1b; 3. 删除键 DEL 4. 判断键是否存在 exists 5. 查找键 KEYS 查…

环境参数自动调节设备:智能生活的绿色守护者

在当今社会&#xff0c;随着科技的飞速发展和人们生活水平的不断提升&#xff0c;对居住环境的要求也日益增高。一个舒适、健康的生活空间&#xff0c;不仅关乎温度、湿度、空气质量等基本环境因素&#xff0c;还涉及到光照、噪音控制等多个维度。为了满足这些多元化的需求&…

【Docomo】5G

我们想向您介绍第五代移动通信系统“5G”。 5G 什么是5G&#xff1f;支持5G的技术什么是 5G SA&#xff08;独立&#xff09;&#xff1f;实现高速率、大容量的5G新频段Docomo的“瞬时5G”使用三个宽广的新频段 什么是5G&#xff1f; 5G&#xff08;第五代移动通信系统&#x…

技术设计评审的重要性及实战指南:让每一行代码都熠熠生辉

在这个快速迭代的软件开发时代,技术设计评审(Technical Design Review, 简称TDR)不仅是项目成功的关键一环,更是每位程序员职业生涯中不可或缺的“导航灯”。它如同一面镜子,让团队能够清晰地看到设计的全貌,及时修正偏差,确保项目朝着既定的目标稳健前行。关注【程序员…

服务器给根目录扩展磁盘(不使用lvm逻辑券)两种方式

因业务需求磁盘存储增加现在需要给/目录进行扩容&#xff0c;因为是云服务器直接在原有的磁盘增加了100G空间现在把新增的100G扩容到/目录分区。 有两种方法一种是使用growpart 工具扩容&#xff0c;一种是使用fdisk命令 使用growpart工具扩容 yum install -y cloud-utils-grow…

为什么我工作 10 年后转行当程序员?逆袭翻盘!

今天文章的主人公暂且称他为 A 君。不过 A 君有点特别&#xff0c;非科班&#xff0c;工作 10 年后才转行 iOS 程序员。今年 36 岁&#xff0c;目前在某行业头部企业任职前端负责人&#xff0c;管理 40 人的前端团队。 废话不多说&#xff0c;我们开始 A 君&#xff08;为了描…

并发编程工具集——Future(二十七)

简介&#xff1a; 创建完线程池&#xff0c;该如何使用获取任务的执行结果&#xff08;execute() 方法没有返回值&#xff09;。 如何获取任务执行结果 Java 通过 ThreadPoolExecutor 提供的 3 个 submit() 方法和 1 个 FutureTask 工具类来支持获得任务执行结果的需求。三个su…

2024年哪些充电宝建议买?最建议买的四款充电宝排行榜!

在 2024 年&#xff0c;充电宝依然是我们生活中不可或缺的电子伴侣。然而&#xff0c;面对市场上众多的充电宝品牌和型号&#xff0c;要挑选到一款既实用又安全可靠的产品并非易事。充电宝的安全性至关重要&#xff0c;毕竟它与我们随身携带的电子设备紧密相连。劣质的充电宝可…

C++软件开发值得推荐的十大高效软件分析工具

目录 1、概述 2、高效软件工具介绍 2.1、窗口查看工具SPY++ 2.2、Dependency Walker 2.3、剪切板查看工具Clipbrd 2.4、GDI对象查看工具GDIView 2.5、Process Explorer 2.6、Prcoess Monitor 2.7、API Monitor 2.8、调试器Windbg 2.9、反汇编工具IDA 2.10、抓包工…