Web框架本质
我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端。 这样我们就可以自己实现Web框架了。
自定义web框架
import socket
#生成socke实例对象
sk = socket.socket()
#绑定IP和端口
sk.bind(("127.0.0.1",8001))
#监听
sk.listen()
#死循环,等待用户链接
while 1:
#获取客户端链接
conn, addr =sk.accept() #系统没有用的变量以_保存
#接受客户端发来的消息
data = conn.recv(8096)
print(data)
#回复
conn.send(b'qnmd')
#关闭
conn.close()
sk.close()
HTTP协议主要规定了客户端和服务器之间的通信格式,那HTTP协议是怎么规定消息格式的呢?
让我们首先打印下我们在服务端接收到的消息是什么,浏览器和服务端通信都必须遵循一个HTTP协议(消息的格式要求)
import socket
#生成socke实例对象
sk = socket.socket()
#绑定IP和端口
sk.bind(("127.0.0.1",8001))
#监听
sk.listen()
#死循环,等待用户链接
while 1:
#获取客户端链接
conn, addr =sk.accept() #系统没有用的变量以_保存
#接受客户端发来的消息
data = conn.recv(8096)
print(data)# 将浏览器发来的消息打印出来
#回复
conn.send(b'qnmd')
#关闭
conn.close()
sk.close()
输出
'GET / HTTP/1.1 《---请求行
Host: 127.0.0.1:8001 《--请求头部onnection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 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,en;q=0.8
' 《--没有请求数据
关于HTTP协议:
a 浏览器往服务端发送的为请求(request)
请求的消息格式:
请求方法: 路径 HTTP/1.1
k1:v1
k2:v2
请求数据:
b 服务端往浏览器发送的为响应(response)
响应的消息格式:
HTTP:/1.1 状态码 状态描述符
k1:v1
k2:v2
响应正文
动态的网页:
本质上都是字符串的替换
字符串替换发生在什么地方:
在服务端替换完在返回给浏览器
web框架的本质:
socket服务端与浏览器的通信
socket服务端和功能划分
a 负责与浏览器收发消息(socket)
b 根据用户访问不同的路径执行不同的函数
c 从HTML读取出内容,并且完成字符串的替换
Django
安装(安装最新LTS版):
pip3 install django==1.11.9
创建一个django项目:
下面的命令创建了一个名为"mysite"的Django 项目:
django-admin startproject mysite
目录介绍:
mysite/ ├── manage.py # 管理文件 └── mysite # 项目目录 ├── __init__.py ├── settings.py # 配置 ├── urls.py # 路由 --> URL和函数的对应关系 └── wsgi.py # runserver命令就使用wsgiref模块做简单的web server
运行Django项目:
python manage.py runserver 127.0.0.1:8000
模板文件配置:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, "template")], # template文件夹位置 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
静态文件配置:
STATIC_URL = '/static/' # HTML中使用的静态文件夹前缀 STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static"), # 静态文件存放位置 ]