web框架底层原理;django介绍

目录

  • 纯手撸web框架
  • 基于wsgiref模块
  • 优化处理
  • 动静态网页
  • 基于jinja2模板语法
  • 框架请求流程
  • python主流web框架
  • *django框架介绍

内容

纯手撸web框架

web框架

将前端、数据库整合到一起的基于互联网传输的python代码,可以简单的理解为是软件开发架构里面的 服务端

  1. 搭建简易版本服务端:socket模块
  2. 遵循HTTP协议:四大特性、数据格式、响应状态码
  3. 基于不同的后缀响应不同的内容

如何获取用户输入的url后缀>>>:HTTP请求数据
/favicon.ico直接忽略,不影响判断
利用字符串切割和索引取值获取相应数据

web框架底层原理;django介绍web框架底层原理;django介绍
import socket

server = socket.socket()
server.bind(('127.0.0.1', 8082))
server.listen(5)

while True:
    sock, addr = server.accept()
    data = sock.recv(1024)
    # 将请求相关数据先转成字符串
    data_str = data.decode('utf8')  # 'GET /login HTTP/1.1\r\nHost: 127.0.0.1:8081\r\n......'
    sock.send(b'HTTP1.1 200 OK\r\n\r\n')
    # 然后去字符串中截取出我们需要的内容(按照空格切割字符串 获取第二个元素即可)
    current_path = data_str.split(' ')[1]
    # 根据后缀的不同返回不同的内容
    if current_path == '/login':
        sock.send(b'hello login!!!')
    elif current_path == '/register':
        sock.send(b'hello register')
    else:
        sock.send(b'404 error')

View Code

上述框架缺陷

  1. 服务端起始代码过于重复
  2. 针对HTTP请求数据没有完善的处理方式
  3. 并发量问题(只能服务一个浏览器)

基于wsgiref模块

  1. 利用模块搭建服务端
  2. 利用模块处理好的HTTP字典数据编写业务,查找用户url后缀对象的键值对数据web框架底层原理;django介绍web框架底层原理;django介绍
from wsgiref import simple_server

def run(request, response):
"""
    :param request: 请求相关的数据
    :param response: 响应相关的数据
    :return: 返回给客户端的展示数据
"""
    # print(request)  # 字典类型的数据(模块自动处理HTTP请求数据 便于后续数据获取)
    response('200 OK', [])  # 固定编写 无需掌握
    current_path = request.get("PATH_INFO")
    if current_path == '/login':
        return [b'hello login html']
    elif current_path == '/register':
        return [b'hello register html']
    return [b'404 error']

if __name__ == '__main__':
    server = simple_server.make_server('127.0.0.1', 8080, run)
    '''一直监听本机8080端口 一旦有请求访问 自动触发run方法的执行'''
    server.serve_forever()

View Code

优化措施

两个问题

  1. 如果网站很多 是不是就是以为的添加elif
  2. 每个分支下的功能根据业务逻辑的不同可能会比较复杂

将匹配和功能封装成元组和函数,所有的代码全部放在一个py文件过于冗余 不便于后期管理维护

根据功能的不同拆分成不同的py文件

  • urls.py:对应关系的存储
  • *views.py:业务逻辑的编写

以后要想新增功能,只需要在urls.py中添加对应关系,view.py中编写函数

业务函数的代码中,可能会频繁的使用到不同的html页面,为了避免文件类型的混乱

单独开设一个文件夹存储所有的html文件

  • *templates文件夹:存储项目所需的html文件

项目中的html文件,也有可能需要用到css、js、第三方框架文件,html所学的css、js、第三方框架代码都是写完之后很少做改动的文件,所以可以

统一存放在某个文件夹下

  • static文件夹:存储项目所需的静态文件*
    动静态网页**

静态网页

页面上的数据是直接写死的,上述项目中编写的 error.html func.html

动态网页

页面上的数据是通过代码动态获取的,实时可变

  • 页面上展示当前时间(后端获取传递给前端界面)web框架底层原理;django介绍web框架底层原理;django介绍
def get_time(request):
    # 1.获取当前时间
    import time
    c_time = time.strftime('%Y-%m-%d %X')
    # 2.读取html文件
    with open(r'templates/get_time.html','r',encoding='utf8') as f:
        data = f.read()
    # 3.思考:如何给字符串添加一些额外的字符串数据>>>:字符串替换
    new_data = data.replace('asdaksdjal',c_time)
    return new_data

View Code
* 页面上展示数据库数据(后端链接数据库查询数据再传递给页面)

jinja2模块

第三方模块

pip3 install jinja2

功能介绍

在编写前后端不分离项目的时候,可以使用该模块提供的模板语法简单快速的在html页面使用类似于后端的代码语法操作数据

模板语法

web框架底层原理;django介绍web框架底层原理;django介绍
temp_obj.render({'user':user_dict,'new_list':new_list})

    {{ user }}
  {{ user.name }}
  {{ user['pwd'] }}
  {{ user.get('hobby') }}

  {% for i in new_list %}
        元素:{{ i }}
  {% endfor %}

View Code

获取数据库中的数据展示到前端页面

还是用的上述模板语法
框架请求流程

web框架底层原理;django介绍
  • 后缀与函数名对应关系 (‘/index’,register)
  • 后缀专业名词称之为’路由’
  • 函数名专业名词称之为’视图函数’
  • urls.py专业名词称之为’路由层’

views.py

  • 专门编写业务逻辑代码
  • 可以是函数,也可以是类
  • 函数专业名词称之为’视图函数’
  • 类专业名词称之为’视图类’
  • views.py专业名词称之为’视图层’

templates文件夹

  • 专门存储html文件
  • html文件专业名词称之为’模板文件’
  • templates文件夹专业名词称之为’模板层’

python主流web框架

前面的知识其实就是web框架的底层原理

django

大而全,自带的功能非常的多,但是有时候会略显笨重,类似于航空母舰

flask

小而精,自带的功能非常的少,但是第三方模块非常的多,类似于游骑兵

flask的第三方模块加到一起甚至比django还多,并且也越来越像django,但是flask由于过多的依赖于第三方模块,有时候也会受制于第三方模块

tornado

异步非阻塞框架 速度极快 甚至可以用于充当游戏服务器

还有一些占比较小 ,但是也很厉害的框架: fastapi、sanic,

框架的核心逻辑几乎是一致的,只需要先学会一种,之后就可以触类旁通
django框架介绍

验证是否下载成功

cmd窗口直接输入 django-admin有反应就是成功了

命令操作django

创建django项目:django-admin startproject 项目名

启动django项目:cd 项目名;python3 manage.py runserver IP:PORT(可以不跟)

创建app应用:python3 manage.py startapp 应用名(app01)

命令行无法自动创建模板文件夹 需要自己执行命令创建

pycharm操作django

  • new project:选择django,填写应用即可
  • 创建更多的app:tools>>>run manage.py task;命令自动提示

  • 启动项目:直接点击绿色箭头;还可以修改端口号 edit configurations

django本身类似于是一个空壳子,真正的功能是由里面的各个应用决定

django框架相当于是一所大学,应用相当于是大学里面的各个学院

大学其实是个壳子 负责提供环境

学院才是一个个真正具备特定功能的集合

  1. 项目文件名
  2. 同名文件夹
  3. settings.py:项目配置文件
  4. urls.py:路由层
  5. manage.py:django入口文件 很多命令都需要该文件支持
  6. db.sqlite3:django启动之后才会生成的文件 其实就是django自带的小型数据库
  7. templates文件夹:模板层
  8. app01:应用文件夹
  9. migrations文件夹:数据迁移记录
  10. admin.py:django自带的后台管理
  11. apps.py:用于app的注册
  12. models.py:专门用于操作数据库
  13. views.py:视图层

创建应用之后,一定要去配置文件中注册才能生效
app01.apps.App01Config
简写语法: app01

web框架底层原理;django介绍

Original: https://www.cnblogs.com/zzs0626/p/16255591.html
Author: 顺溜_7
Title: web框架底层原理;django介绍

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582450/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Linux系统编程—信号捕捉

    前面我们学习了信号产生的几种方式,而对于信号的处理有如下几种方式: 默认处理方式; 忽略; 捕捉。 信号的捕捉,说白了就是抓到一个信号后,执行我们指定的函数,或者执行我们指定的动作…

    Linux 2023年6月14日
    0123
  • JAVA设计模式-原型模式

    JAVA设计模式-原型模式 介绍 原型模式是一种创建型模式,用于创建重复的对象,并且保证性能。原型模式创建的对象是由原型对象自身创建的,是原型对象的一个克隆,和原型对象具有相同的结…

    Linux 2023年6月6日
    099
  • 剑指offer计划19( 搜索与回溯算法中等)—java

    1.1、题目1 剑指 Offer 64. 求1+2+…+n 1.2、解法 这题看评论区真的绝了,都是人才,各个说话都好听,我看到个还有用异常来结束的就离谱。这题用了&a…

    Linux 2023年6月11日
    093
  • Redis 缓存更新一致性

    在使用 Redis 作为数据库缓存的场景中对数据的读取流程通常是先读取缓存如果命中则返回,未命中则从数据库读取并把数据写到缓存中。 当更新数据时则数据库和缓存都要进行更新,此时我们…

    Linux 2023年5月28日
    091
  • 真·Android Zxing 扫码中文乱码解决

    Zxing3.2.1 之前遇到过Android Zxing扫码乱码的问题,网上搜了下解决了下。 今天又遇到了问题。 依然会乱码。 研究总结如下: Zxing 可以在Hints中添加…

    Linux 2023年6月13日
    081
  • linux下通过命令连接wifi

    故事背景:我司是做新零售的,机器支持4G、wifi、网线,可能会涉及到网络的切换和连接 项目需求:用户在web端输入wifi名称和密码,客户端可以通过服务端下发的信息进行连接 技术…

    Linux 2023年6月13日
    088
  • STM32CubeIDE学习记录(按键点灯工程)

    博主使用的开发板以及相关外设连接如下: 芯片型号为: STM32F103RCT6, 新建STM32CubeIDE项目 配置完成后会生成相应的文件并进入如下界面: 使用外部晶振时钟 …

    Linux 2023年6月14日
    0134
  • 非常实用的 Shell 脚本

    检测两台服务器指定目录下的文件一致性 #!/bin/bash<br>#####################################<br>#&a…

    Linux 2023年5月28日
    072
  • Ubuntu18开启默认root登录方法

    默认的Ubuntu 18.04系统在登陆界面上是不支持root用户直接登录的,但是你可以使用下面的方法让Ubuntu 18.04也支持root登录,其他类似的版本参考在Ubuntu…

    Linux 2023年6月7日
    099
  • 【微服务】- Nacos-注册中心

    微服务 – 注册中心 – Nacos 😄生命不息,写作不止🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆 一个有梦有戏的人 @怒放吧德…

    Linux 2023年6月6日
    0141
  • 记一次从源码泄露到getshell(二)

    0x00 前言 文章所述漏洞已经提交至漏洞平台,且所有恶意操作均已复原 0x01 源码泄露 http://www.xxx.com.cn/www.zip 老规矩拿到源码先通关关键词找…

    Linux 2023年5月28日
    0105
  • nginx 修改文件上传大小限制

    修改nginx的配置文件,添加client_max_body_size 字段 注:client_max_body_size必须要放在server下的server_name下,而不是…

    Linux 2023年6月8日
    099
  • 建表参数PCTFREE、PCTUSED、INITRANS和MAXTRANS释疑

    PCTFREE与PCTUSED建表时可以指定以上两个参数的值(整数),PCTFREE表示一个块中保留的剩余空间大小百分比,该保留空间主要用于已有记录的更 新操作;PCTUSED表示…

    Linux 2023年6月14日
    089
  • 数据库配置和前端项目创建

    1、封装Response utils.py/exception from rest_framework.response import Response class APIResp…

    Linux 2023年6月14日
    099
  • k8s vs k3s: 差异解析

    2. K3s的优势 小型 K3s 的最大优势是它的尺寸最小(小于 100 MB),这有助于它以最少的设置在小型硬件中启动 Kubernetes 集群。 快速部署 curl -sfL…

    Linux 2023年6月13日
    0114
  • springboot整合redis的发布订阅模式

    所谓发布订阅模式,就是发布了消息丢到通道中,消费者进行消费 看代码: 1 首先需要配置这个连接工厂 ,这地方可能有人有疑问,为什么需要单独做一个类呢,是由与这个连接工厂其他地方需要…

    Linux 2023年5月28日
    0103
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球