2024--Django平台开发-Web框架和Django基础(二)

day02 Web框架和Django基础

今日概要:

  • 网络底层引入,到底什么是web框架?
  • 常见web框架对比
  • django快速上手(创建网站)
  • 常见操作:虚拟环境、django项目、多app应用、纯净版
  • 逐点剖析:路由、视图、模板、静态文件、ORM

1.web框架底层

1.1 网络通信

注意:局域网。

个人一般写程序,想要让别人访问:阿里云、腾讯云。

  • 去云平台租服务器(含公网IP)
  • 程序放在云服务器

让网络中可以互相通信的双发收发数据。

  • 我的电脑【服务端】

    python 复制代码
    import socket
    
    # 1.监听本机的IP和端口
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind(('192.168.10.3', 8001))  # 我自己的电脑IP,端口8001
    
    # 2.让多少人等待
    sock.listen(5)
    
    while True:
        # 3.等待连接请求的申请,有人来连接(阻塞)
        conn, addr = sock.accept()
    
        # 4.连接成功后立即发送
        conn.sendall("欢迎使用xx系统".encode("utf-8"))
    
        # 5.断开连接
        conn.close()
    
    
    # 6.停止服务端程序
    sock.close()
  • 女朋友的电脑(同一个局域网)【客户端】

    python 复制代码
    import socket
    
    # 1. 向指定IP发送连接请求
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(('192.168.10.3', 8001))
    
    # 2. 接收你发的消息
    message = client.recv(1024)
    print(message.decode("utf-8"))
    
    # 3.断开连接
    client.close()
  • 姓王的好兄弟【客户端】

    python 复制代码
    import socket
    
    # 1. 向指定IP发送连接请求
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(('192.168.10.3', 8001))
    
    # 2. 接收你发的消息
    message = client.recv(1024)
    print(message.decode("utf-8"))
    
    # 3.断开连接
    client.close()

    我们自己写时,通过socket模块可以实现网络上的两端进行通信。

1.2 常见软件架构

  • bs架构

    浏览器:充当客户端
    服务器:网站
    
  • cs架构,开发应用程序,例如:QQ、Pycharm、网易云音乐(安装在电脑上的软件)

    客户端:安装在电脑上的软件。 网易云音乐
    服务端:网易服务器
    

对于程序原来说:

  • 网站,只需要写服务端程序。

    基于django开发的本质就是网站(web应用)
    电脑上浏览器本质上是socket实现网络通信。
    
  • 软件,客户端 + 服务端。

1.3 手撸web框架

快速自己写以为网站(不能用django、flask等)。

python 复制代码
import socket

# 1.监听本机的IP和端口
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('192.168.0.6', 9000))  # 我自己的电脑IP,端口8001

# 2.让多少人等待
sock.listen(5)

while True:
    # 3.等待连接请求的申请,有人来连接(阻塞) -> 登录浏览器来连接我
    conn, addr = sock.accept()

    # 4.收到浏览器发送的消息
    buf = conn.recv(2048)
    print(buf)

    # 5.给浏览器返回数据
    conn.send(b"HTTP/1.1 200 OK\r\n\r\n")
    conn.send(b"Hello, World")

    # 6.断开连接
    conn.close()

# 6.停止服务端程序
sock.close()

再引出一个知识点,浏览器再与服务端的网站进行通信时,多了几个规则。

  • 服务端:网站

  • 客户端:浏览器

    • 创建连接

    • 发送数据,固定格式

      # 请求头首行
      GET /xxx/xxx/?name=xxx&age=111 HTTP/1.1\r\n
      
      # 请求头
      Host: 192.168.0.6:9000\r\n
      Connection: keep-alive\r\n
      Upgrade-Insecure-Requests: 1\r\n
      User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36\r\n
      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n
      Accept-Encoding: gzip, deflate\r\n
      Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7\r\n\r\n'
      
      # 请求头首行
      POST /xxx/xxx/ HTTP/1.1\r\n
      
      # 请求头
      Host: 192.168.0.6:9000\r\n
      Connection: keep-alive\r\n
      Upgrade-Insecure-Requests: 1\r\n
      User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36\r\n
      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n
      Accept-Encoding: gzip, deflate\r\n
      Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7\r\n\r\n
      # 请求体
      username=wupeiqi&password=123
      
      浏览器本质上发送请求时,包含请求头和请求体。
      - GET请求
      	- 只有请求头 + 没有请求体
      	- 请求头之间用 \r\n
      	- 请求头和请求体之间用 \r\n\r\n
      	
      - POST请求
      	- 只有请求头 + 有请求体
      	- 请求头之间用 \r\n
      	- 请求头和请求体之间用 \r\n\r\n
      
    • 一次请求和一次响应后,断开连接。

告诉你两个关键点:

  • http协议?

    http协议特点:无状态的短连接。
    http的应用:浏览器向服务端发送请求,就是按照http协议来的。
    	- 请求头+请求体 ;请求头和请求体之间用 \r\n\r\n ;请求头之间用 \r\n
    	- 一次请求和一次响应后,断开连接。  -> 短连接。  ->无状态如何体现?
    	- 后期记住 请求头+cookie
    
  • GET请求和POST到底有什么区别?

2.web框架

常见的web框架:django、flask、tornado、sanic、fastapi...

web应用程序:

  • 用户网络通信的socket
  • web框架
  • 业务开发

以django为例:

  • wsgiref模块、uwsgi、daphne -> 本质上都是socket实现。
  • 原来实现了框架

以flask为例:

  • werkzurg、uwsgi、...
  • flask框架

以tornado为例:

  • tornado、werkzurg、uwsgi、...
  • 框架

2.1 wsgiref

python 复制代码
from wsgiref.simple_server import make_server


def run_server(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ]


if __name__ == '__main__':
    httpd = make_server('127.0.0.1', 8000, run_server)
    httpd.serve_forever()

2.2 werkzeug

pip install werkzeug
python 复制代码
from werkzeug.wrappers import Response


def application(environ, start_response):
    response = Response('Hello World!', mimetype='text/plain')
    return response(environ, start_response)


if __name__ == '__main__':
    from werkzeug.serving import run_simple

    run_simple('localhost', 4000, application)

2.3 各框架的区别

django、flask、tornado、sanic、fastapi..
  • 内部集成功能的多少

    • django,内部提供了很多组件。 【相对大】
    • flask、tornado、sanic、fastapi... 本身自己功能很少+第三方组件。【相对小】
  • 同步框架 vs 异步非阻塞

    • 异步非阻塞:tornado、sanic、fastapi、django

    • 同步:django、flask、bottle、webpy...

      1.django、flask
      2.tornado,异步非阻塞,特别NB。
      	- 同步:常见应用。
      	- 异步:IO应用 + conroutine装饰器 + redis/MySQL/...
      3.sanic,路飞小猿圈平台
      4.fastapi
      	- 参考flask
      	- py最新注解
      	- restfulAPI
      	- 异步
      	
      目前不看好:
      	- 增加编程的难度,功能&效率
      	- 项目中不会有那么IO操作 ---> 100功能/2-IO ---> celery
      

感受不深刻,只是听我讲完了,鬼吹这么NB东西到底是怎么实现的?


小结

  1. django项目开发,在局域网部署访问。所有人访问云服务器。
  2. bs架构、cs架构。
  3. 基于socket实现web框架(所有web框架的祖宗)
  4. 常见web框架的区别。
    • 功能
    • 异步非阻塞

问题?

1.短链接和长连接有啥区别?

2.websocket 协议 :程序控制连接(腾讯文档,实时更新,多人共享)

相关推荐
superman超哥20 分钟前
04 深入 Oracle 并发世界:MVCC、锁、闩锁、事务隔离与并发性能优化的探索
数据库·oracle·性能优化·dba
熊的猫36 分钟前
JS 中的类型 & 类型判断 & 类型转换
前端·javascript·vue.js·chrome·react.js·前端框架·node.js
瑶琴AI前端1 小时前
uniapp组件实现省市区三级联动选择
java·前端·uni-app
会发光的猪。1 小时前
如何在vscode中安装git详细新手教程
前端·ide·git·vscode
engchina1 小时前
Neo4j 和 Python 初学者指南:如何使用可选关系匹配优化 Cypher 查询
数据库·python·neo4j
engchina1 小时前
使用 Cypher 查询语言在 Neo4j 中查找最短路径
数据库·neo4j
尘浮生1 小时前
Java项目实战II基于Spring Boot的光影视频平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·maven·intellij-idea
威哥爱编程1 小时前
SQL Server 数据太多如何优化
数据库·sql·sqlserver
小华同学ai1 小时前
AJ-Report:一款开源且非常强大的数据可视化大屏和报表工具
数据库·信息可视化·开源
Acrelhuang2 小时前
安科瑞5G基站直流叠光监控系统-安科瑞黄安南
大数据·数据库·数据仓库·物联网