web框架本质
我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端。 这样我们就可以自己实现Web框架了
可以说Web服务本质上都是在这十几行代码基础上扩展出来的。这段代码就是它们的祖宗。
HTTP协议主要规定了客户端和服务端之间的通信格式
所以我们收发消息需要严格按照HTTP格式来
自定义最基础的web框架
from socket import * server=socket(AF_INET,SOCK_STREAM) server.bind(("127.0.0.1",8080)) server.listen() while True: conn,addr=server.accept() date=conn.recv(1024) conn.send(b"HTTP/1.1 200 OK <h1>objk</h1>") conn.close()
根据不同的路径返回不同的内容
import socket server=socket.socket() server.bind(("127.0.0.1",8080)) server.listen() while True: conn,addr=server.accept() date=conn.recv(1024) #转换成str类型 date=str(date,encoding="utf8") #获取url中的访问路径 date1=date.split(" ")[0].split(" ")[1] print(date1) #http协议返回消息也要加状态行 conn.send(b"HTTP/1.1 200 OK ") if date1=="/home/": response=b"home" elif date1=="/index/": response=b"index" else: response=b"<h1>ojbk</h1>" conn.send(response) conn.close()
根据不同的路径返回不同的内容(函数版)
import socket server=socket.socket() server.bind(("127.0.0.1",8080)) server.listen() def home(url): s = "这是{}页面!".format(url) return bytes(s, encoding="gbk") def index(url): return b"index" while True: conn,addr=server.accept() date=conn.recv(1024) #转换成str类型 date=str(date,encoding="utf8") #获取url中的访问路径 date1=date.split(" ")[0].split(" ")[1] #http协议返回消息也要加状态行 conn.send(b"HTTP/1.1 200 OK ") if date1=="/home/": response=home(date1) elif date1=="/index/": response=index(date1) else: response=b"<h1>ojbk</h1>" conn.send(response) conn.close()
根据不同的路径返回不同的内容(函数升级版)
import socket server=socket.socket() server.bind(("127.0.0.1",8000)) server.listen() def home(url): s = "这是{}页面!".format(url) return bytes(s, encoding="gbk") def index(url): return b"index" while True: conn,addr=server.accept() date=conn.recv(1024) #转换成str类型 date=str(date,encoding="utf8") #获取url中的访问路径 date1=date.split(" ")[0].split(" ")[1] #http协议返回消息也要加状态行 url_list=[ ("/home/",home), ("index",index), ] fuck=None for i in url_list: if date1==i[0]: fuck=i[1] break if fuck: response=fuck(date1) else: response = b"404 not found!" conn.send(b"HTTP/1.1 200 OK ") conn.send(response) conn.close()
加入html文件
import socket server=socket.socket() server.bind(("127.0.0.1",8000)) server.listen() def home(url): s = "这是{}页面!".format(url) return bytes(s, encoding="gbk") def index(url): return b"index" def login(url): with open("登录页面.html","r",encoding="utf8")as f: s=f.read() return bytes(s, encoding="utf8") while True: conn,addr=server.accept() date=conn.recv(1024) #转换成str类型 date=str(date,encoding="utf8") print(date) #获取url中的访问路径 date1=date.split(" ")[0].split(" ")[1] print(date1) #http协议返回消息也要加状态行 url_list=[ ("/home/",home), ("/index/",index), ("/login/",login) ] fuck=None for i in url_list: if date1==i[0]: fuck=i[1] break if fuck: response=fuck(date1) else: response = b"404 not found!" conn.send(b"HTTP/1.1 200 OK ") conn.send(response) conn.close()
终极暗黑无敌版
import socket import time server=socket.socket() server.bind(("127.0.0.1",8000)) server.listen() def home(url): s = "这是{}页面!".format(url) return bytes(s, encoding="gbk") def index(url): return b"index" def login(url): with open("登录页面.html","r",encoding="utf8")as f: s=f.read() return bytes(s, encoding="utf8") def user(url): now_time=str(time.time()) with open("user.html","r",encoding="utf8")as f: s=f.read() s=s.replace("@@xx@@",now_time) return bytes(s, encoding="utf8") while True: conn,addr=server.accept() date=conn.recv(1024) #转换成str类型 date=str(date,encoding="utf8") print(date) #获取url中的访问路径 date1=date.split(" ")[0].split(" ")[1] print(date1) #http协议返回消息也要加状态行 url_list=[ ("/home/",home), ("/index/",index), ("/login/",login), ("/user/",user) ] fuck=None for i in url_list: if date1==i[0]: fuck=i[1] break if fuck: response=fuck(date1) else: response = b"404 not found!" conn.send(b"HTTP/1.1 200 OK ") conn.send(response) conn.close()
wsgiref实例
from wsgiref.simple_server import make_server import time def home(url): s = "这是{}页面!".format(url) return bytes(s, encoding="gbk") def index(url): return b"index" def login(url): with open("登录页面.html","r",encoding="utf8")as f: s=f.read() return bytes(s, encoding="utf8") def user(url): now_time=str(time.time()) with open("user.html","r",encoding="utf8")as f: s=f.read() s=s.replace("@@xx@@",now_time) return bytes(s, encoding="utf8") url_list=[ ("/home/",home), ("/index/",index), ("/login/",login), ("/user/",user) ] def run_server(environ,start_response): start_response("200 OK",[('Content-Type','text/html;charset=utf8'),]) url = environ['PATH_INFO'] fuck=None for i in url_list: if url==i[0]: fuck=i[1] break if fuck: response=fuck(url) else: response = b"404 not found!" return [response,] if __name__ == '__main__': httpd=make_server('127.0.0.1',8090,run_server) print('我在8090等你哦。。。') httpd.serve_forever()
Django
安装Django
1.在cmd命令行中敲入命令
pip3 install django==1.11.9
2.在pyCharm中直接下载
创建一个django项目
1.在cmd命令行中敲入命令
django-admin startproject mysite
2.打开pyCharm中的File--->new project--->选中Django--->创建一个新的项目即可
运行Django项目
1.在cmd命令行中敲入命令
python manage.py runserver 127.0.0.1:8000
2.点一下下图的绿色按钮(一般都在pyCharm的左上方 和 右上方)
静态文件配置
STATIC_URL = '/static/' # HTML中使用的静态文件夹前缀 STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static"), # 静态文件存放位置 ]
Django基础必备三件套:
from django.shortcuts import HttpResponse, render, redirect
HttpResponse:内部传入一个字符串参数,返回浏览器
例如:
def index(request): # 业务逻辑代码 return HttpResponse("OK")
render:接受一个URL参数,表示跳转到指定的URL。
例如:
def index(request): # 业务逻辑代码 return render(request, "index.html", {"name": "alex", "hobby": ["烫头", "泡吧"]})
redirect:接受一个URL参数,表示跳转到指定的URL。
例如:
def index(request): # 业务逻辑代码 return redirect("/home/")