一、作者感悟

之前学了java,可以简单的用ssm框架写点网页,后来入黑盒测试,自学了python,但说实话我更比较喜欢java那种规规矩矩,现在只是自己 写个脚本爬虫更多的会用python灵活

二、什么是MVC、MTV

python 的MVC和java的一样,分别是Model、View、Controller,也就是我们通常说的模型(model)-视图(view)-控制器(controller),分别对应着数据库、模板文件、业务处理。

MTV 分别是 Model、Template、View,分别对应的是数据库、模板文件、业务处理,python Django,用的就是MTV模式

三、初识python 的web流程

要知道代码的逻辑关系,和数据走向,这是我当时学java ssm框架时候心得,python 自学也从这句话开始.

WSGI(Web Server Gateway Interface),python标准库提供的独立WSGI服务器称为wsgiref。
from wsgiref.simple_server import make_server
def RunServer(environ, start_response):
#environ 客户发来的所有信息 environ['PATH_INFO']获取地址
#start_response 返回响应信息
start_response('200 OK',[('Content-Type', 'text/html')])
return ['

Python

'.encode('utf-8')]

if __name__ == '__main__':
httpd = make_server('',8000,RunServer)
httpd.serve_forever()

访问http://127.0.0.1:8000/,就能看到页面python

下一步要做的就是,有多个页面对应多个响应信息,environ是个字典,里面就有从客户端返回的地址信息environ['PATH_INFO']

from wsgiref.simple_server import make_server
def RunServer(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
current_url = environ['PATH_INFO']
#http://127.0.0.1:8000/index
if current_url == '/index':
return ['

welcome

'.encode('utf-8')] 
 
#http://127.0.0.1:8000/data
elif current_url == '/data':
return ['
DATa
'.encode('utf-8')] 
 
#必须写,因为客户端会给服务器端发送/favicon.ico 也就是ico图片
else:
return ['
404
'.encode('utf-8')] 
 
if __name__ == '__main__':
httpd = make_server('',8000,RunServer)
httpd.serve_forever()
else 是必须写的因为客户端会返回/favicon.ico 这样我们的代码可以对他做判断,上面的代码其实我们可以吧 /index 和/data 写成函数如下:
from wsgiref.simple_server import make_server
#/data
def handle_data():
return ['
DATa
'.encode('utf-8')] 
 
#/index
def handle_index():
return ['
welcome
'.encode('utf-8')] 
 
def RunServer(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
current_url = environ['PATH_INFO']
#http://127.0.0.1:8000/index
if current_url == '/index':
return handle_data()
#http://127.0.0.1:8000/data
elif current_url == '/data':
#必须写,因为客户端会给服务器端发送/favicon.ico 也就是ico图片
return handle_index()
else:
return ['
404
'.encode('utf-8')] 
 
if __name__ == '__main__':
httpd = make_server('',8000,RunServer)
httpd.serve_forever()

要是 20个网页我们就给写20个if判断么,这时候我们就可以用字典来解决这个问题

from wsgiref.simple_server import make_server
def handler_index():
return ['index'.encode('utf-8')]
def handler_data():
return ['data'.encode('utf-8')]
#用字典封装方法
URL_DICT = {
'/data' : handler_data,
'/index' : handler_index,
}
def RunServer(environ, start_response):
#environ 客户端返回
#start_response 服务器端响应给用户
start_response('200 OK',[('Concent-Type', 'text/html')])
current_url = environ['PATH_INFO']
fun = None
#先用变量接收
if current_url in URL_DICT:
fun = URL_DICT[current_url]
if fun:
return fun()
else:
return ['404'.encode('utf-8')]
if __name__ == '__main__':
httpd = make_server('',8000,RunServer)
httpd.serve_forever()

我的网页要是有很多内容怎么办,总不能在return 全拼出来吧,这时候就是MVC登场了


image.png

首先我们创建一个文件夹叫Controller,这里面是处理层,我们把刚才的写的响应给用户展示的方法放在account.py 文件

#用io 读的方法,去读取放在VIEW层的页面
def handler_index():
with open('/views/index','rb') as f:
data = f.read()
#替换html内容 data.replace()
f.close()
return [data,]
def handler_data():
return ['data'.encode('utf-8')]

我们创建一个VIEWS层,里面用来存放我们的html

我们在写一个入口

from wsgiref.simple_server import make_server
#却controller 读取我们的 方法
from Controller import account
#用字典封装方法
URL_DICT = {
'/data' : account.handler_data,
'/index' : account.handler_index,
}
def RunServer(environ, start_response):
#environ 客户端返回
#start_response 服务器端响应给用户
start_response('200 OK',[('Concent-Type', 'text/html')])
current_url = environ['PATH_INFO']
fun = None
#先用变量接收
if current_url in URL_DICT:
fun = URL_DICT[current_url]
if fun:
return fun()
else:
return ['404'.encode('utf-8')]
if __name__ == '__main__':
httpd = make_server('',8000,RunServer)
httpd.serve_forever()