linRichielinRichie
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
    • Python学习指南
  • 快速开始

    • Python: 输入与输出 (I/O)
    • Python: 异常处理 try-except
    • Python: List深入概述
    • Python: 面向对象编程(OOP)
  • Python 语法库函数

    • 语法库目录
    • 库

      • library目录
      • argparse:解析命令行参数
      • difflib:比较序列并生成差异信息
      • dnspython: DNS处理库
      • IPy:IP地址处理库
      • logging:记录和管理日志信息
      • os:访问和操作操作系统
      • psutil:系统性能信息库
      • re:正则表达式库
      • smtplib:邮件发送库
    • 函数

      • function目录
      • any() 函数
      • input 函数
      • lambda 和 map 函数
      • reversed()函数
      • zip()函数
    • 语句

      • statement目录
      • import 语句
      • Try/Exception 异常
    • 概念

      • concept目录
      • 深拷贝与浅拷贝
      • 列表、字典与元组
      • 文件读写
      • IO: 输入与输出
      • 逻辑判断与条件语句
      • OOP 面向对象:class
      • OOP: 面向对象编程
  • SQLAlchemy

    • 获取insert或者update的id
  • Pandas

    • Pandas目录
    • Pandas:基础操作
    • Pandas:数据处理与转换
    • Pandas: 数据写入 excel 表格
  • Python前端框架

    • Flask

      • 1. Flask简介
      • 2. Flask程序基本结构
      • 3. Flask请求-响应循环
      • 4. flask案例: 框架网页查询IP
      • Python: Flask中的GitHub OAuth
    • Django

      • chapter-01:Django框架认识

        • 1.1 Django的产生背景
        • 1.2 MTV设计模式
        • 1.3 Django 主要功能模块
      • chapter-02:开发环境配置

        • 2.1 Python的安装与配置
        • 2.2 虚拟环境安装与配置
        • 2.3 Django安装与配置
        • 2.4 MySQL安装配置
      • chapter-03:项目框架搭建

        • 3.1 Django管理工具-创建项目骨架
        • 3.2 修改项目的默认配置
        • 3.3 初始化项目环境
      • chapter-04:ORM应用与原理剖析

        • 4.1 构建POST应用需要的数据集
        • 4.2 Model相关的概念和使用方法
        • 4.3 Model的查询操作API
        • 4.4 ORM实现原理
      • chapter-05:Django管理后台

        • 5.1 将Model注册到管理后台
        • 5.2 管理后台实现原理
      • chapter-06:视图

        • 6.1 视图基础
        • 6.2 视图的高级特性和快捷方法
        • 6.3 基于类的通用视图
      • chapter-07:模板系统

        • 7.1 模板系统基础
        • 7.2 模板语言
      • chapter-08:表单系统

        • 8.2 使用表单系统实现表单: ModelForm
      • chapter-09:用户认证系统

        • 9.1 用户与身份认证
        • 9.2 权限管理
        • 9.3 用户认证系统应用
      • chapter-10:Django路由系统

        • 10.1 路由系统基础
      • chapter-11:Django中间件

        • 11.1 中间件基础
  • Python例子

    • Python: Linux的Shell命令
    • Python: PEP8自动格式化代码
    • Python: pip操作
    • Python: 业务服务监控
    • Python: 从文件逐行读取数据
    • 将链表转换为字符串
    • Python: 检查URL是否能正常访问
    • Python: 爬取网易云音乐
    • Python: 读取目录下的所有内容
    • 案例研究:文本统计
  • Python爬虫

    • 数据解析工具:Xpath
  • 算法题

    • 02:两数相加
    • 09:回文数
    • 13:罗马数值转换为整数
    • 14:最长公共前缀

1.3 Django 主要功能模块

  • 1.3 Django 主要功能模块
    • 1.3.1 Django中的ORM
      • ORM:对象映射关系
        • 例子
    • 1.3.2 用户模块与权限系统
      • 设计思想,思考
      • 用户模块
    • 1.3.3 Admin后台管理系统
    • 1.3.4 视图
    • 1.3.5 模板系统
    • 1.3.6 表单系统Form
    • 1.3.7 信号机制
    • 1.3.8 路由系统
    • 1.3.9 中间件
    • 1.3.10 缓存系统

1.3.1 Django中的ORM

ORM:对象映射关系

  • ORM(Object Relational Mapping,对象映射关系):把对象与数据库中的表关联起来,对象的属性映射到表的各个字段,还把对表的操作对应到对象的操作,实现了对象到SQL,SQL到对象的过程转换
  • Django的ORM:使用了多种常用的数据库,PostgreSQL,MySQL,Oracle等
  • Django把表模型定义为Model,定义过程比较简单,只需要集成django.db.models中的Model类就可以了,Model类中的每一个属性都能映射到表的对应字段
  • 针对数据库中提供的字段类型,Django ORM都有对应的*Filed表示
    • CharField,TextField,DateField等
  • 对于数据库表的增删改查,Django也提供了简单且优雅的API

例子

  • 系统中存在一张User表,有name和password两个字符型的字段,如何利用Django的ORM实现User Model
class User(models.Model):
 name = models.CharField(max_length=150)
 password = models.CharField(max_length=128)
  • 检索系统中的所有User记录
User.objects.all()
  • 检索系统中name含有a的所有User记录
User.Objects.filter(name__contains='a')
  • 创建name是b,password是c的User记录
User.Objects.create(name='b',password='c')

1.3.2 用户模块与权限系统

设计思想,思考

开发任何一个站点都需要有用户的概念,用户登录,注销过程,用户浏览页面,订阅消息等功能,都需要由用户系统实现

Django提供的用户模块,能够快速实现与用户相关的基本功能

有了用户的概念,还需要对用户做一些区分,那些是普通用户,那些是管理员用户,那些是超级管理员用户

Django提供了权限系统作为解决方案

用户模块

Django的用户模块定义在auth应用中,主要提供的功能

  • 实现用户与用户组,维护用户与用户组的关系
  • 权限系统的逻辑设计
  • 对每个Model添加增删改的权限
  • 用户与用户组的权限定义
  • 用户鉴权与登录功能
  • 登录,注销,权限验证等功能相关的函数和装饰方法

1.3.3 Admin后台管理系统

  • 针对数据存储表构建后台管理系统
  • Django 提供了 Admin Web后台管理系统进行解决
  • 新建项目系统之后,几乎不用做任何配置,Django就设置害了后台管理的功能
  • 原生的Admin可以利用Model Admin实现个性化定制,如:针对字段值过滤,搜索功能,排序功能,针对数据表字段的展示顺序规则定义功能,字段归类功能等

1.3.4 视图

MTV设计模式的V,在Django中的提现是一个Python函数或者类,接受Web请求并返回Web响应

  • 视图返回的相应可以是HTML文档
  • 可以是重定向
  • 或者Excel
# 简单的视图函数
from django.http import HttpResponse
def hello_django(request):
    return HttpResponse("<html><body>Hello Django </body></html>")


# 从django.http 模块引入HTTPResponse,是视图的相应类型
# 定义一个hello_django的函数,也是一个视图函数
# 视图返回文本相应内容,是一个HttpResponse类型的对象
  • Django规定视图函数至少需要一个参数,且第一个参数是django.http.HttpResponse类型的对象
    • 携带了Web请求的所有信息,按照约定称为:request
    • 函数的名字并不关心,通常的做法是:将函数名称对应到实现的具体功能上

1.3.5 模板系统

  • 把HTML硬编码到Python代码不是一个好的方案,原因:
    • HTML代码主要实现站点的展现形式,且展现形式往往是需要经常修改的。直接硬编码到代码中,对HTML的修改必须要修改Python代码,但是实际的业务逻辑没有改变,不利于维护
    • 业务实现上的python代码和HTML代码并不存在交集,耦合在视图中,会增加系统的复杂度,且维护起来会更加困难
  • 利用模板系统,可以将页面设计的HTML代码和用于逻辑处理的Python代码分离
  • 例子
<html><body>{{value}}</body></html>
def hello_django(request):
    return render(request,'hello.html',{'value':'Hrllo Django'})
  • 上面利用模板系统实现数据与逻辑的分离,解耦了业务处理逻辑与数据展现形式

1.3.6 表单系统Form

  • 表单系统一般比较复杂,不同的表单的处理过程又是相似的

  • 表单的完整过程

    • 不同类型的数据项在表单中渲染成功HTML向用户展示
    • 用户在表单中编辑并提交数据到后端服务器
    • 服务逻辑对数据进行验证,以及后续的处理或者提示用户输入数据有误等等
  • Django表单系统的核心Form类,提供4个主要功能

    • 自动生成HTML表单元素
    • 检查表单数据的合法性
    • 对不合法的表单数据进行回显,提示错误
    • 将表单数据转换为对应的Python数据类型
  • 例子:实现需要用户输入用户名和密码并提交验证

from django import forms
class LoginForm(forms.Form):
    name = forms.CharField()
    password = forms.CharField()

然后创建模板文件 login.html,对应

<form action="/login/" method="post">
  {% csrf_token %}
  {{ form }}
  <input type="submit" value="submit">
</form>

最后,创建试图完成登录处理逻辑

def login(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            # process user login
            return HttpResponse("login success")
    else:
        form = LoginForm()
    return render(request,'login.html',{'form':form})

1.3.7 信号机制

Django 对信号机制的解释:在框架的不同位置传递特定的消息给应用程序执行特定的操作

  • 是一种观察者模式(发布-订阅模式)
  • 当系统中有event(事件)发生,一组senders(发送者)将signals(信号)发送给一组receivers(接收者),receivers再去执行预定的操作
  • Django预定的信号
    • 关于Model的执行动作信号
    • 关于Http请求的执行动作信号
  • 例子:Http请求到来的时候触发信号
  1. 实现消息接受这receiver,打印Request Coming

    def receiver(sender, **kwargs):
        print("Request Coming")
    
  2. 将信号绑定到receiver上面(也可以使用装饰器实现绑定)

    from django.core.signals import request_started
    request_started.connect(receiver)
    
  3. 最后,等待Http请求到来,触发receiver的执行。Django信号机制的执行是同步的,所以,耗时的任务不可使用信号机制

1.3.8 路由系统

MTV的设计模式中

  • 用户向web站点发送请求(对应到一个URL)
  • 先到达“对应的”视图,试图如何对应,需要路由
  • Django利用URLconf构建起URL模式与试图函数之间的映射关系
  • Django路由系统配置的核心是:path
  • 基本格式
from django.urls import path
urlpatterns = [
  path(route, view, kwargs=None, name=None)
]
  • path的四个参数
    • route:标识URL的正则表达式;必填
    • view:标识试图函数;必填
    • kwargs:标识以字典的形式传递给视图的默认参数;可选
    • name:给route起一个名字,用于反向解析;可选
  • 路由匹配模式,可以把Django的URL映射类型分为3类
    • 固定URL映射:path('bbs/',views.bbs)
    • 动态URL映射:path('bbs/<int:page>',views.bbs_list)
    • 两级(多级)URL映射:path('topic/',include('topic.urls')): 将所有的topic的请求都嫁给topic这个App下面的urls去处理

1.3.9 中间件

  • 中间件是一个插件系统,嵌入到Django的Request和Response之间执行,可以对输入和输出的内容进行修改。

  • 中间件是用来定义处理所有请求和相应的通用处理框架

  • 中间件就是一个普通的Python类对象,定义了一些函数在试图执行的前后调用,这些函数称为钩子函数,且名称固定

    • process_request:在请求到来的时候调用
    • process_view:在对应的视图函数执行之前调用
    • process_exception:在视图函数抛出异常的时候调用
    • process_template_response:在视图函数有相应,且响应对象包含render方法时调用
    • process_response:在返回响应之前调用
  • 除了单个中间件执行的生命周期,Django也规定了中间件的执行顺序与配置的关系

  • 配置越靠前的中间件越先被执行,从上到下顺序地执行每一个中间件,返回的时候正好相反,按照各个中间件配置的顺序逆序执行

yCVQ4aReYLlIOs7

  • 中间件将特定的业务处理逻辑和通用服务解耦
  • 作为一个可插拔的组件对外提供服务

1.3.10 缓存系统

  • 访问web站点的某一个服务会发现执行比较慢,这种情况发生的原因可能情况

    • 后端的复杂计算靠逻辑
    • 访问数据库系统或者文件系统造成的I/O延迟
  • 提高web站点执行效率的方法:使用缓存

  • 将经常被用户访问的页面结构保存下来,再次访问是只需要返回缓存的结果即可

  • Django能够无实现不同级别的缓存粒度

    • 缓存单个视图的结果输出
    • 缓存难以生成的片段
    • 缓存整个网站
  • Django支持多种缓存类型

    • Memcached
    • 数据库
    • 文件系统等
    • 或者根据需要开启一种或者多种缓存类型
  • 例子:缓存一个视图的结果

from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def hello_django(request):
    pass
  • 上面的代码,只比原来的视图函数多了一个cache_page装饰器,就可以将视图的结果缓存15分钟(装饰器的参数是秒)
最近更新时间:
Prev
1.2 MTV设计模式