第一章 Django基础与虚拟环境

news/2024/11/15 12:05:50/文章来源:https://www.cnblogs.com/Tmars/p/18395263

1.Web框架和Django框架

1.1网络通信

img
注意:局域网

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

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

img

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

  • 服务端【我的电脑】
import socket# 1.监听本机的IP和端口
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
socket.bind(('127.0.0.1',8080))# 2.让多少人等待
sock.listen(5)# 3.循环接受客户端发来的请求连接
while True:# 4.等待连接请求的申请,有人来连接(阻塞)conn, addr = sock.accept()# 5.连接成功后立即发送conn.sendall("欢迎使用xxx系统".encode("utf-8"))# 6.断开连接 conn.close()# 7.停止服务端程序
sock.close()

客户端【其他人的电脑】

import socket# 1.向指定IP发送连接请求
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client = connect(('127.0.0.1',8080))# 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等)。

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到底有什么区别?

get请求他请求的东西在网站的访问网址里面,一般?后面的东西
post请求的东西一般装的是密码,放在request进行加密,让程序员看到,别人看不到

2.web框架

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

image-20220619111206007

web应用程序:

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

以django为例:

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

以flask为例:

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

以tornado为例:

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

2.1 wsgiref

from wsgiref.simple_server import make_serverdef 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
from werkzeug.wrappers import Responsedef application(environ, start_response):response = Response('Hello World!', mimetype='text/plain')return response(environ, start_response)if __name__ == '__main__':from werkzeug.serving import run_simplerun_simple('localhost', 4000, application)

image-20220619112446494

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东西到底是怎么实现的?

  • socket & 多线程 & 多进程
  • IO多路复用
  • 顿悟
https://www.cnblogs.com/wupeiqi/p/6536518.html

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

元组操作示例

首先需要定义元组 T = (abc,12,3.45,python,2.789) 输出完整数组 print(T) 输出元组的最后一个元素 print(T[-1]) 输出元组的第二、三元素 print(T[1:3]) print("学号:2023310143008") 结果如下图所示:

WebShell流量特征检测_蚁剑篇

80后用菜刀,90后用蚁剑,95后用冰蝎和哥斯拉,以phpshell连接为例,本文主要是对这四款经典的webshell管理工具进行流量分析和检测。 什么是一句话木马? 1、定义 顾名思义就是执行恶意指令的木马,通过技术手段上传到指定服务器并可以正常访问,将我们需要服务器执行的命令上…

【PyCharm】解决虚拟环境pip无法使用问题

@目录1.新建虚拟环境的bug描述解决方法2.更换路径的bug解决方法2.虚拟环境使用2.1 特性2.2 进入与退出进入退出1.新建虚拟环境的bug 描述在PyCharm内新建或者打开一个项目时,我们需要选择一个python解释器,如果我们选择新建一个虚拟环境,如下图所示:进入项目后,我们打开终…

AURIX™ Development Studio1.10.2(ADS)安装使用教程

以TC264系列MCU为例,介绍安装与使用AURIX™ Development Studio1.10.2的方法。零、介绍 AURIX™ Development Studio是Infineon为TriCore™-based AURIX™ microcontroller系列车规单片机设计的一款免费IDE(集成开发环境),基于Eclipse IDE开发。其包含了C编译器、TASKING调试…

随机森林分类模型 0基础小白也能懂(附代码)

随机森林分类模型 原文链接 啥是随机森林 随机森林是一种由决策树构成的(并行)集成算法,属于Bagging类型,通过组合多个弱分类器,最终结果通过投票或取均值,使得整体模型的结果具有较高的精确度和泛化性能,同时也有很好的稳定性,广泛应用在各种业务场景中。随机森林有如…

Redis组件介绍(六)

今天学习redis最后的知识写在前面 今天学习redis最后的知识。 Redis 的发布与订阅 发布/订阅模式 Redis 提供了两种发布/订阅模式:基于频道 (Channel) 的发布/订阅 基于模式 (Pattern) 的发布/订阅相关命令订阅频道 subscribe channel [channel ...]订阅给定的一个或多个频道。…

prometheus学习笔记之集群内服务发现环境准备

一、环境介绍主要演示prometheus在k8s集群中如何通过服务自动去发现k8s集群自有服务及其他服务发现场景,后续会演示集群外部署prometheus自动发现k8s服务并获取数据创建监控使用的namespaceskubectl create ns monitoring配置docker可以下载镜像[root@k8s-master deploy]# cat…

使用列表推导式实现嵌套列表的平铺

先遍历列表中嵌套的子列表,然后再遍历子列表的元素并提取出来作为最终列表中的元素 a=[[1,2,3],[4,5,6],[7,8,9]] 通过列表推导式[c for b in a for c in b],我们首先将a中的每个子列表(这里用变量b表示) 遍历出来,然后对每个b进行遍历,提取出它的每个元素(这里用变量c表…

章10——面向对象编程(高级部分)——两种单例模式

代码如下: //单例模式 //instance--实例 //该篇中记录了饿汉模式和懒汉模式 public class HungryMan {public static void main(String[] args) {Single01.say();Single02.say();} }class Single01{//只能有instance这一个实例。private Single01(){System.out.println("…

列表操作示例

首先先定义一个列表,列表是写在[]里,用逗号隔开的,元素是可以改变的 列表的截取语法结构是:变量[头下标:尾下标] L = [abc,12,3.45,python,2.789] 输出完整列表 print(L) 输出列表的第一个元素 print(L[0]) 将列表的第一个元素修改为‘a’ L[0]=a 将列表的第2个元素到第3个…

如何设计真正的实时数据湖?

通过剖析“以湖代仓”观点的认知误区,本文提出了数据的流表二象性理论,并基于“流驱表”理念指出了湖仓融合的正确发展方向——利用流式计算加速湖内仓的数据流转,落地真正的实时数据湖。汽车制造行业在企业数据管理方案上的探索已有数十年之久,本文以辩证的视角回顾了这段…