1,web框架的原理
1.1>c/s架构和b/s架构
1>c/s客户端模式
2>B/S浏览器模式-----web开发(web开发开的是B/S架构)
1.2>web开发的本质
1.2.1>互联网上两台机器之间的通信:(1)IP,(2)端口,(3)协议
1.2.2>协议:(1)HTTP默认端口是80,(2)HTTPS默认端口是443
1.2.3>HTTP get请求格式
1.2.4>HTTP相应格式
1.3>浏览器输入URL回车返回页面,这之间都经历了什么?
(1)域名 ->DNS解析 ->IP地址 ->服务端 ->返回消息 ->浏览器
(2)浏览器 <==> 服务器
(3)服务器吧写好的HTML页面,返回给;浏览器按照HTML格式进行渲染(显示)
2,python中的web框架的分类
2.1>收发socket消息,按照HTTP协议解析消息
2.2>字符串替换
2.3>业务逻辑处理
自己实现2.1,2.2,2.3的是tornado框架
自己实现2.2,2.3使用别人的2.1是Django框架
自己实现2.3使用别人的2.1,2.2是flask
另一个维度 的框架分类:1,Django 2,其他
3,Django的安装
3.1>django注意版本LTS
3.2>安装命令:pip install Django == 1.11.11(卸载Django:pip uninstall django)
3.3>创建第一个Django项目
3.3.1>命令行创建:django-admin startproject 项目名
3.3.2>在pycharm:File ->new Project ->左侧选第二项,右侧第一项是路径,第二页是python版本,在新的pycharm窗口打开新建的Django项目
3.4>启动django项目
3.4.1>在命令行启动:在django项目的跟目录下,执行下面的命令
python manage.py runserver
python manage.py runserver 8080
停止:Ctrl + c
3.402>pycharm启动:点绿色的三角,注意左侧框中的名字一定钥匙项目名称!
4,模拟web服务器
4.1>普通版本
import socket sk = socket.socket() sk.bind(("127.0.0.1",8080)) sk.listen() while 1: conn,addr = sk.accept() data = conn.recv(1024) #接收到的是一个byte类型的数据需要转化成字符串,注意编码 data_str = str(data,encoding="utf-8") #对字符串进行切割操作 first_line = data_str.split(" ")[0] #对请求按空格切割 url = first_line.split(" ")[1] if url == "/xuexue/": msg = b"hello" elif url == "/xiaoxue/": msg = b"miss" else: msg = b"404 not found !" conn.send(b"HTTP/1.1 200 Ok ") conn.send(msg) conn.close()
客户端fade是个啥
'''GET /yingying/ HTTP/1.1 Host: 127.0.0.1:8080 Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 '''
4.2>模拟web服务器的函数版本
import socket sk = socket.socket() sk.bind(("127.0.0.1",8080)) sk.listen() def xuexue(url): #这个哪吒说必须传url参数,但是不传参数也可以啊 data = b"hello" return data def xiaoxue(url): data = "miss" return bytes(data,encoding="utf-8") while 1: conn,addr = sk.accept() data = conn.recv(1024) data_str = str(data,encoding="utf-8") first_line = data_str.split(" ")[0] url = first_line.split(" ")[1] if url == "/xuexue/": msg = xuexue(url) elif url == "/xiaoxue/": msg = xiaoxue() else: msg = b"404 not found !" conn.send(b"HTTP/1.1 200 ok ") conn.send(msg) conn.close()
4.3>模拟web服务器的反射进阶版
import socket sk = socket.socket() sk.bind(("127.0.0.1",8080)) sk.listen() def xuexue(url): return b"hello" def xiaoxue(url): data = "miss" return bytes(data,encoding="utf-8") url_func = [ ("/xuexue/",xuexue), ("/xiaoxue/",xiaoxue) ] while 1: conn,addr = sk.accept() data = conn.recv(1024) data_str = str(data,encoding="utf-8") first_line = data_str.split(" ")[0] url = first_line.split(" ")[1] for el in url_func: if el[0] == url msg = el[1](url) else: msg = b"404 not found" conn.send(b"HTTP/1.1 200 ok\r ") conn.send(msg) sonn.close()
4.4> 静态网页版本
import socket sk = socket.socket() sk.bind(("127.0.0.1",8080)) sk.listen() def xuexue(url): data = "hello" return bytes(data,encoding="utf-8") def xiaoxue(url): data = "miss" return bytes(data,encoding="utf-8") def login(url): with open("login.html","rb") as f: data = f.read() return data url_func = [ ("/xuexue/",xuexue), ("/xiaoxue/",xiaoxue), ("/login/",login) ] while 1: conn,addr = sk.accept() data = conn.recv(8192) data_str = str(data,encoding="utf-8")#bytes类型转化成字符串可以直接转化,并且加一个编码. first_line = data_str.split(" ")[0] url = first_line.split(" ")[1] for el in url_func: if el[0] ==url: msg = el[1](url) else: msg = b"404 not found !" conn.send(b"HTTP/1.1 200 ok ") conn.send(msg) conn.close()
4.5>动态网页版本
import socket import time sk = socket,socket() sk.bind(("127.0.0.1",8080)) sk.listen() def xuexue(url): data = "hello" return bytes(data,encoding="utf-8") def xiaoxue(url): data = "miss" return bytes(data,encoding="utf-8") def login(url): with open("login.html","r") as f: data = f.read() now = str(time.time()) data = data.replace("@@xx@@",now) return bytes(data,encoding="utf-8") url_func = [ ("/xuexue/",xuexue), ("/xiaoxue/",xiaoxue), ("/login/",login) ] while 1: conn,addr = sk.accept() data = conn.recv(8192) data_str = bytes(data,encoding="utf-8") first_line = data_str.split(" ")[0] url = first_ine.split(" ")[1] for el in url_func: if el[0] == url: msg = el[1](url) else: msg = b"404 not found !" conn.send(b"HTTP/1.1 200 ok ") conn.send(msg)