dtcms模板 Android svn checkbox layout bitmap vue部署 spark项目 广告投放系统源码 js事件绑定 div外边距 idea整理代码格式 ubuntu显示隐藏文件夹 matlab插值函数 idea批量替换快捷键 mysql入门 python的range python字典类型 python中count python中items python对象 python命令 python分析 java对象和类 java安装步骤 java实现多线程 java的特性 rendercontrol 迷你版kms 冬青鼠 黑白照片一键变彩色 华为一键root工具 数科阅读器 为什么英雄联盟无法连接服务器 催眠魔蛙 上传附件 dxsetup VSPD pr蒙版 英雄联盟设置
当前位置: 首页 > 学习教程  > 编程语言

Django框架

2020/9/19 16:38:52 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

python-django框架基础:

灵魂三问–>

  • 1.什么是web应用?
    • 在浏览器中可以直接使用的应用程序
    • B(Browser,浏览器) / S(Server,服务器) 模式的应用
    • HTML + CSS + JavaScript Python程序(为浏览器网页提供动态内容)
  • 2.为什么要用python写web应用?
    • .net / Java / PHP / Ruby / Go / Python
      • Python少有的简单优雅,能够用很少的代码做更多的事,开发效率极高。
      • Python有很多的三方库都支持Web应用开发
        • Django / Flask / Tornado / Sanic / FastAPI —> 虚拟化部署
  • 3.为什么要使用Django框架?
    • 功能上最为完整的Web框架
    • 源于真实商业项目的框架 --> 源于劳伦斯报业集团 管理系统 CMS(内容管理系统)/MIS
    • 生态圈最为繁荣 (不用重复造轮子,直接用别人的成果来做自己的开发)

step1. 一切的开始:

前期准备:

  • 安装django-admin工具

    • pip install django==2.2.14(django2.2左右的版本已经比较成熟,遇到的问题基本能找到解决办法.)
    • django-admin --version
  • 创建第一个Django项目~~

    • django-admin startproject hellojango
      • manage.py --> Django项目的管理脚本
      • hellodjango --> Django项目文件夹 <— PyCharm
        • settings.py -> Django项目的配置文件
        • urls.py -> URL映射文件(我们常说的router路由配置)
        • wsgi.py -> Web Server Gateway Interface --> 可以理解为协议Web项目的入口程序
  • 在terminal中创建虚拟环境并添加依赖项

    • Terminal --> (venv)
    • pip install django==2.2.14
    • pip freeze > requirements.txt —> 将依赖项冻结,并输出重定向到requirements.txt清单中.
  • 运行Django项目

    • terminal
      • python manage.py runserver (可以自定义端口)
  • 创建Django项目的应用: 一个项目下可以包含一个或者多个应用

    • Terminal中输入命令:
      • python manage.py startapp demo
      • django-admin startapp demo
    • models.py —> 模型 —> 数据
    • views.py —> 视图函数 —> 接受用户请求,给用户响应
  • 使用Django的admin应用管理模型

  • 把Django项目自带的模型变成数据库中的表

    • python manage.py migrate
    • 创建超级用户
      • python manage.py createsuperuser
  • 中间件 —> 拦截过滤器

    • 拦截用户的请求和响应,添加额外的功能代码 (代理模式,和装饰器的作用一样,自定义中间件的写法和装饰器也一样)
      • web应用中的装饰器

step2.ORM模型和MVC模型:

1.静态页的动态加载

  • 对完成的api接口进行简单的测试,可以写一些简单的模板页:
    • 静态页—>模板页(可以生成动态内容的动态页)

      –> 前后端分离的话,不用在意接口的测试模板,(POSTMAN足够测试了.)

      • {% for %} {% if %} —> 模板指令,结束的时候写{% end %}
      • {{ }} —> 模板占位符语法
    • Ajax -> Asynchronous JavaScript and Xml

      • 异步请求 + 局部刷新
      • 异步请求: 通过JavaScript代码在不中断用户体验的前提下,向服务器发起请求
        • fetch
      • 局部刷新:通过JavaScript做DOM操作修改页面的某个局部(一般还是用的Vue.js,原生js代码实在太多了o_o)
        • document.query

一个小补充:鸭子类型(duck typing):(动态语言的判断数据的类型) -->鸭子判定法:

​ 只要具有相应的功能和行为,就是这个类型.不论该对象本来是否是这个类型

2.ORM模型

  • ORM(Object-Relational Mapping,对象关系映射) 机制 —> 由于

    • 向数据库写数据时,ORM会将对象模型自动转换成关系模型
    • 从数据库读取数据时,ORM会将关系模型自动还原成对象模型
      • ORM解决了对象模型和关系模型的双向转换问题
    • 模型类 —> CRUD (Create / Read / Update / Delete) --> 转换成一个对象模型(类)方便我们进行crud操作
    • 创建对象: subject = Subject()
      • 新增:
        • subject.name = ‘…’
        • subject.save()
      • 更新:
        • subject.name = ‘…’
        • subject.save()
      • 删除:
        • subject.delete()
      • 查询:
        • Subject.objects.all() —> 返回一个QuerySet 对象
        • Subject.objects.filter(主键)—> 筛选出的QuerySet 对象
          • Subject.objects.filter(主键).first() —> 拿到筛选出的QuerySet 对象 的第一个元素与get方法相同
        • Subject.object.get(主键) —> 拿到主键对应的目标对象
    • 元信息 (Meta-information)
    • 元数据 (Meta-data)
  • 将数据库的表生成模型(表变模型):

    • python manage.py inspectdb > polls/models.py
  • 模型变表:

    • 生成迁移脚本: python manage.py makemigrations polls
    • 执行迁移脚本: python manage.py migrate polls

2.MVC架构

  • MVC架构模式 —> MTV架构

  • Model-View-Controller

    • Model --> 数据(模型) —> M
    • View --> 视图(数据的显示) —> T
    • Controller —> 控制器(连接数据和视图的桥梁) —> V
      • 获取数据并决定由哪个视图最终呈现数据
    • 数据和显示的解耦合(分离) —> 同一组数据可以呈现为不同的视图—> 同一个视图上可以加载不同的数据.
  • 关系型数据库中的数据完整性

    • 实体完整性 -> 每个实体都是独一无二的 (没有重复记录) -> 主键/唯一约束(索引)
    • 参照完整性 -> 父表没有的记录子表不能有(父表没有该主键,子表的不能有对应的外键列) ->通过外键实现 -> 对性能有影响
    • 域完整性 -> 录入数据库的数据都是有效的 -> 数据类型和长度,非空约束,默认值约束,检查约束
      • alter table tb_student add constraint ck_student_birth check (stubirth between ‘1980-1-1’ and ‘1999 -12 -31’);

step3.djano中的用户跟踪

1.CSRF —> Cross Site Request Forgery - 跨站请求伪造

  • Django框架出于安全性的考虑(担心钓鱼网站套取用户身份信息进行表单提交.所以要求每个提交的表单必须携带一个CSRF令牌)

2.用户跟踪

  • 让服务器记住用户 —> 用户跟踪

    • HTTP —> 不会保存连接 —> 两次请求服务器时不能判断是不是之前登录的用户
    • 服务器: session(会话)对象 —> dict —> 用(键值对)保存和用户相关的数据 (保存的是session对象)
    • 浏览器: 浏览器通过本地存储保存session对象的标识符,如Cookie,indexDB,(保存cookie,是sessionid 标识符,每次请求的时候,请求头里会带上cookie数据(包含sessionid))
  • 实现用户跟踪 —> 记住用户才能提供个性化的服务

    • 服务器:维护session对象,session对象保存用户相关数据,把session对象的表示符写入到用户相关数据,把session对象的标识符写入到用户浏览器中
    • 浏览器:记住session对象的标识符,每次请求携带该标识符
      • cookie:浏览器的临时文本文件,以键值对方式保存用户数据
      • localstorage(不手动删都还在)/sessionstorage(关浏览器就清空): 本地存储(二者生命周期不同)
      • IndexDB /Web SQL: 嵌入式数据库
  • Django框架默认对session对象进行了持久化操作

    • 服务器重启之后,用户的会话(session)仍然是存在的
    • django_session表,用BASE64编码处理session数据并保存(但是用户数据不能存在数据库,数据库是性能的瓶颈.)
    • 把session数据保存到Redis中以缓解数据库的压力并通过Redis的
  • encodeURIComponent() —> 将url做成百分号编码,再传给其他url

  • Django-Debug-Toolbar

    • 如何处理1+N查询问题(重复关联查询) —> 发的语句里 join on 关联查询
      • 一对一/多对一关系: select_related
      • 多对多: prefetch_related (预抓取)
      • only() -> 只查括号里的字段
      • defer() -> 不查括号里的字段

step4.django中的数据持久化

1.用redis做数据持久化:(redis只用来做过缓存ovo)

  • Redis持久化数据的两种方案

    • RDB - 内存中的数据dump到一个文件中 dump.rdb
    • AOF - Append Only File --> 记录数据到
    • (redis的第二种启动方式)redis-server --bind (私有ip) --port (端口) --requirepass (密码) --appendonly yes > redis.log &

2.json数据格式的好处:

  • 如果视图函数返回JSON格式数据 —> 数据接口 —> 网络api接口

  • 提供数据接口是一种非常好的封装服务的方式

    • 调用数据接口时不区分操作系统和编程语言(跨平台跨语言)
    • 将来大多数产品都会倾向于将软件做成可调用的服务
      • 每个自治化的团队负责一个服务数据接口的开发
      • 每个接口只提供相对单一的功能,但是可以将多个接口组织起来构成复杂的系统—>微服务架构
  • 测试网络API接口

    • Postman/Postwoman
    • JMeter

3.python读写Excel:

  • python 读写Excel文件

    • Excel 2003- —> xlrd(read) / xlwt(write)
    • Excel 2007+ —> openpyxl
    • Excel 文件 —> 工作簿(Workbook) —>
  • 字符串和字节串

    • str (不变字符串) —> 不可变类型 —> 写操作会产生新的str对象

    • bytes (不变字节串) —> 不可变类型 —> 写操作会产生新的bytes对象

    • 频繁修改时

      • open(filename,‘r’) —> read() —> str

      • open(filename,‘rb’) —> read() —> bytes

  • 如果希望知道SQL执行状况,有两种方式可以处理:

    • Django-Debug-Toolbar
    • 配置日志

step5.Django-RestFramework (DRF)

  • 前后端分离开发:

    • 前端渲染
      • 前端模板引擎:
      • 前端MV* 框架: AngularJS / Avalon / Vue.js
  • Django框架下数据接口的开发:

    • djangorestframework,也就是我们常说的drf
      • Django REST Framework
      • REST - REpresentational State Transfer
      • URL —> 统一资源定位符 —> 资源(网页,音乐,视频,PDF文件)
        • 资源有不同的表现形态(表现层),用户在访问资源时,
        • 可能会对资源进行获取,新增,删除,修改等操作,
        • 对资源的操作会引发资源状态转移
    • HTTP作者认为REST是最适合互联网应用的架构风格,
    • 如果按照REST风格(架构) 开发互联网应用,这种应用汇具有非常好的水平扩展性
  • DRF的运用:

    • 1.pip install djangorestframework

    • 2.序列化模型对象

      • 自定义序列化器 -> ModelSerializer
    • 3.实现数据接口的方式:

      • FBV (function Base View) -> 基于函数的视图 -> 灵活性好,代码量稍大(用的比较多)
      • CBV (Class Base View) -> 基于类的视图 -> 开发效率高,但是灵活度不高(比较简单)
    • 4.同样:使用POSTMAN测试数据接口

    • 5.控制接口的访问

      • DRF 中有自定义认证类和授权类
    • Authentication & Authorization

  • 异步任务和定时任务:

    • Celery -> 分布式任务队列

    • 异步任务:一个请求过来需要执行的操作是比较耗时的操作,可以对此操作进行异步化处理。异步化处理的请求不会因为耗时操作而阻塞,让用户长时间等待.

      • 把任务(用户不需要马上得到最终结果的任务)推迟执行
      • 多线程 / 多进程
      • 消息队列: 把任务保存到消息队列中,等待处理消息的服务器有富余的处理能力时,再进行
    • 异步任务相当于是消息的生产者 -> put —> 消息队列 —> get --> 下游节点是消息的消费者

      • ActiveMQ / RocketMQ / Kafka / ZeroMQ / RabbitMQ
      • Redis —> list —> rpush/blpop —> FIFO
    • 定时任务:任务不是人为触发,而是到了指定的时间自动执行(由时间任务自动触发执行)

      • 比如一个投票的任务,用户明天只能投5票;每天0点,将用户的投票数重置为5票
    • windows 环境下使用celery除了要安装celery库之外,还要安装eventlet

      • pip install celery redis eventlet
      • 启动消费者
        • celery -A hello worker -P eventlet -l debug
  • django中将异步任务或定时任务执行结果持久化到数据库:

    • pip install django-celery-results

      •   	settings.py ---> INSTALLED_APPS =['django_celery_results',
        ]
        
    python manage.py migrate django_celery_results
    
  • 异步化的第二种方式:建连接池,使用多线程(ovo比较简单,就不写在这里了~~)

  • 用django自动生成api接口文档

    pip install django-rest-swagger
    

本文链接: http://www.dtmao.cc/news_show_200447.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?