Python教程之Web框架介绍 WEB框架的本质是什么?

鳄鱼君Ba

发表文章数:519

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python教程 » Python教程之Web框架介绍 WEB框架的本质是什么?

所有的WEB框架本质上都是一个Socket。让服务端先运行起来,客户端写一个socket,客户端和服务端通过TCP连接,连接之后就可以进行数据传递。浏览器充当的就是一个socket客户端,浏览器去请求,建立TCP连接,连接完成之后断开,一次请求一次响应就断开了!

我们来看一段简单的socket代码:

#服务端
import socket
def handle_request(client):
    data=client.recv(1024) #接收客户端发过来的消息
    client.send('HTTP/1.1 200 OK\r\n\r\n'.encode()) #发送给客户端
    client.send("Hello World!".encode())
def main():
    server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #IPV4 tcp
    server.bind(('localhost',8000)) #监听8000端口
    server.listen(4) #最大监听数量为4
    while True:  #一直等待连接
        conn,addr=server.accept() #返回两个值,第一个连接的标记,第二个是对方的地址
        handle_request(conn) #处理请求
        conn.close()
if __name__=='__main__':
    main() #如果是主函数执行main

代码就是一个简单的socket服务端,运行代码然后在浏览器中访问:http://127.0.0.1:8000/,你就会看到服务端发送给我们的数据:Hello World!

所有的web框架本质就是上面的代码,这个使我们自己写的socket服务端,其实在Python中为我们提供了一个模块wsgiref,它帮我们封装了socket。我们在pycharm中安装,可使用命令pip install --default-timeout=5000 wsgiref,使用pip命令安装wsgiref模块需要注意Python < 3.2,Python3.7应该是自带的吧!我的没安装就可以使用。

使用wsgiref模块,我们就不需要在写关于socket的代码,它在内部已经帮我们创建好了,代码参考:

from wsgiref.simple_server import make_server
def RunServer(environ,start_response):
    """
    :param environ:封装了客户端发来的所有数据
    :param start_response: 封装要返回给客户端的数据,响应头,状态码
    :return: Hello World!
    """
    start_response('200 OK',[('Content-Type','text/html')])
    return ['<h1>Hello World!</h1>'.encode(),] #bytes类型
if __name__=='__main__':
    #有客户的连接,就会触发RunServer函数
    httpd=make_server('127.0.0.1',8000,RunServer) #ip 端口 函数
    print("Server HTTP on port 8000...") #监听信息
    httpd.serve_forever() #运行

在Python3.x里面需要注意字节类型,RunServer函数返回的必须是bytes类型,去掉列表也会报错:A server error occurred. Please contact the administrator.运行上面的代码,我们访问:http://127.0.0.1:8000/,就会看到Hello World!当然也不是固定的,你可以随意进行修改。

这样我们就实现了跟socket一样的功能。但是我们呢知道基本上url是可变的,我们呢可以访问:http://127.0.0.1:8000/、http://127.0.0.1:8000/index、http://127.0.0.1:8000/page,那么我们想要对不同的url实现不同的显示方式该怎么办?

from wsgiref.simple_server import make_server
def handle_index():
    return ['<h1>Hello World!\nThis is index!</h1>'.encode(), ]  # bytes类型
def handle_page():
    return ['<h1>Hello World!\nThis is page!</h1>'.encode(), ]  # bytes类型
def RunServer(environ,start_response):
    """
    :param environ:封装了客户端发来的所有数据
    :param start_response: 封装要返回给客户端的数据,响应头,状态码
    :return: Hello World!
    """
    start_response('200 OK',[('Content-Type','text/html')])
    client_url=environ['PATH_INFO']
    if client_url=='/index': #判断url
        return handle_index() #返回index
    elif client_url=='/page':
        return handle_page() #返回page
    else:
        return ['<h1>404 Not Found!</h1>'.encode(), ]  # bytes类型 返回404
if __name__=='__main__':
    #有客户的连接,就会触发RunServer函数
    httpd=make_server('127.0.0.1',8000,RunServer) #ip 端口 函数
    print("Server HTTP on port 8000...") #监听信息
    httpd.serve_forever() #运行

我们只需要对不同的url路径进行判断,不同的页面返回不同的函数即可。有人又问了url路径你是怎么知道的呢?在pycharm中,我们可以利用断点调试,发现这个路径在哪:

Python教程之Web框架介绍 WEB框架的本质是什么?

至于如何在pycharm中使用断点调试,可参考:,这里不做详细介绍。那么我们有很多很多个页面,就要这样判断很多次吗?其实我们可以把所有的url放在一个字典中,不同的url对应不同的函数,代码参考:

from wsgiref.simple_server import make_server
def handle_index():
    return ['<h1>Hello World!\nThis is index!</h1>'.encode(), ]  # bytes类型
def handle_page():
    return ['<h1>Hello World!\nThis is page!</h1>'.encode(), ]  # bytes类型
URL_DICT={
    '/index':handle_index,
    '/page':handle_page,
}
def RunServer(environ,start_response):
    """
    :param environ:封装了客户端发来的所有数据
    :param start_response: 封装要返回给客户端的数据,响应头,状态码
    :return: Hello World!
    """
    start_response('200 OK',[('Content-Type','text/html')])
    client_url=environ['PATH_INFO']
    func=None
    if client_url in URL_DICT: #判断url
       func=URL_DICT[client_url]
    if func:
        return func()
    else:
        return ['<h1>404 Not Found!</h1>'.encode(), ]  # bytes类型 返回404
if __name__=='__main__':
    #有客户的连接,就会触发RunServer函数
    httpd=make_server('127.0.0.1',8000,RunServer) #ip 端口 函数
    print("Server HTTP on port 8000...") #监听信息
    httpd.serve_forever() #运行

相比于上一个代码,这个简洁了许多,但是存在多个url,还需要写个多个函数来处理,没错,我们必须要这么做才行。以上代码可以分开放入不同的文件,对于http://127.0.0.1:8000/index,我们可以单独创建一个index.html文件,handle_index函数内部可以读取index.html文件并返回,http://127.0.0.1:8000/page也用一样的方式处理。页面非常多的情况下,我们就需要创建很多的html文件,为何不把所有的页面整合到一个文件夹(View)中呢!

如果有很多个url请求,我们就需要建立很多处理的函数,函数多了,为何不再建里一个文件夹(Controller)呢?那么我们就有了

这样我们在处理的时候就需要在对应的文件中导入相应的文件就可以,代码同样可以跑起来!再往深处思考,index.html文件中可以添加一些动态的数据,从数据库中?或者函数在处理的时候进行动态的修改替换,有何不可以呢?比方说处理index页面的函数可以从数据库中提取内容,其它页面的处理函数都可以进行这样的操作,那么我们又可以新建一个文件夹(Model),用来操作数据库。

缕一缕上面的内容,我们一共创建了三个文件夹:Model(数据库操作)、Views(模板文件)、Controller(业务处理),非常巧合实现了MVC框架,很显然就是对文件职责的划分,各司其职。还有一个MTV跟我们的构想是一样的,它包含Model、Template、View,跟MVC相比只是文件夹有所不同,其它的都是一样的,我们可以对上面的文件夹的名字进行修改,就成为了MTV!

到这里你已经学会了MTV和MVC框架,这其实就是最简单的Web框架,有关web框架的内容就这么多,非常的简单!

– END –

未经允许不得转载:作者:鳄鱼君Ba, 转载或复制请以 超链接形式 并注明出处 鳄鱼君Ba
原文地址:《Python教程之Web框架介绍 WEB框架的本质是什么?》 发布于2020-04-04

分享到:
赞(3) 赏杯咖啡

评论 抢沙发

5 + 7 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册