参考连接:老男孩培训老师
一、web应用流程:
- 浏览器发送一个http请求
- 服务器收到请求,生成一个html文档
- 服务器把html文档作为一个响应的body发送给浏览器
- 浏览器收到http响应,从http body取出html文档并显示
二、WSGI-web框架:
python内置的web服务器,检查用,框架用来解析http
step1:简单访问与响应
from wsgiref.simple_server import make_server
def application(environ, start_response):
"""
sever端
environ:封装所有请求信息的对象
start_response:方便设置响应头--告诉浏览器,响应体是什么
"""
start_response('200 OK', [('Content-Type', 'text/html')])
return [b'<h1>Hello, web!</h1>'] # 返回响应体
# ip 端口 应用名称
# 封装socket绑定bind与监听listen
httpd = make_server('', 8080, application)
print('Serving HTTP on port 8000...')
# application执行,开始监听HTTP请求:
httpd.serve_forever()
step2:添加不同的响应路径
from wsgiref.simple_server import make_server
def application(environ, start_response):
# path 端口后面的路径
path = environ['PATH_INFO']
start_response('200 OK', [('Content-Type', 'text/html')])
f1 = open("index1.html","rb")
data1 = f1.read()
f2 = open("index2.html","rb")
data2 = f2.read()
# 通过if elif else匹配路径
if path=="/yuan":
return [data1]
elif path=="/alex":
return [data2]
else:
return ["<h1>404</h1>".encode('utf8')]
httpd = make_server('', 8080, application)
httpd.serve_forever()
step3:解耦
from wsgiref.simple_server import make_server
def f1():
f1 = open("index1.html","rb")
data1 = f1.read()
return [data1]
def f2():
f2 = open("index2.html","rb")
data2=f2.read()
return [data2]
def application(environ, start_response):
print(environ['PATH_INFO'])
path = environ['PATH_INFO']
start_response('200 OK', [('Content-Type', 'text/html')])
if path=="/yuan":
return f1()
elif path=="/alex":
return f2()
else:
return ["<h1>404</h1>".encode("utf8")]
httpd = make_server('', 8502, application)
print('Serving HTTP on port 8084...')
# 开始监听HTTP请求:
httpd.serve_forever()
step4:替代if else写路径
from wsgiref.simple_server import make_server
def f1(req):
print(req)
print(req["QUERY_STRING"])
f1=open("index1.html","rb")
data1=f1.read()
return [data1]
def f2(req):
"""req:形参"""
f2=open("index2.html","rb")
data2=f2.read()
return [data2]
import time
# 模版以及数据库
def f3(req):
import time
f3 = open("index3.html","rb")
data3 = f3.read()
times = time.strftime("%Y-%m-%d %X", time.localtime())
# 后端:替换index3.html文件中 定义的变量!time!
data3 = str(data3,"utf8").replace("!time!",str(times))
return [data3.encode("utf8")] # 字符串转字节
def routers():
"""
这样就不用写if else来匹配路径了
以后有页面就只需要在这里扩充urlpatterns
"""
urlpatterns = (
('/yuan',f1),
('/alex',f2),
("/cur_time",f3)
)
return urlpatterns
def application(environ, start_response):
"""
environ:封装所有请求信息的对象
"""
print(environ['PATH_INFO'])
path = environ['PATH_INFO']
start_response('200 OK', [('Content-Type', 'text/html')])
urlpatterns = routers()
func = None # 用来存f1 f2 f3
for item in urlpatterns:
if item[0] == path:
func = item[1]
break # 匹配上退出
if func:
return func(environ)
else:
return ["<h1>404</h1>".encode("utf8")]
httpd = make_server('', 8518, application)
print('Serving HTTP on port 8084...')
# 开始监听HTTP请求:
httpd.serve_forever()
三、 MVC和MTV模式
MVC模式:所谓MVC就是把web应用分为三层:
模型(Mode),数据库部分
控制器(Controller)+url 业务逻辑与路径分发
视图(View),html文件
Django的MTV分别代表:
Model(模型):负责业务对象与数据库的对象(ORM)
Template(模版):负责如何把页面展示给用户
View(视图):负责业务逻辑,并在适当的时候调用Model和Template
此外,Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template
django实现流程
安装: pip3 install django --》 添加环境变量
#1 创建project
django-admin startproject mysite
当前目录下会生成mysite的工程,目录结构如下
mysite
---- manage.py(启动文件)
---- mysite
---settings.py
---url.py(目录分配)
---wsgi.py(网络服务器:封装socket 和 解析http协议)
#2 创建APP,可创建多个应用
python manage.py startapp app01
#3 settings配置
TEMPLATES
STATICFILES_DIRS=(
os.path.join(BASE_DIR,"statics"),
)
STATIC_URL = '/static/'
# 我们只能用 STATIC_URL,但STATIC_URL会按着你的STATICFILES_DIRS去找
#4 根据需求设计代码
url.py
view.py
#5 使用模版
render(req,"index.html")
#6 启动项目
python manage.py runserver 127.0.0.1:8090
#7 连接数据库,操作数据
model.py