• Web框架


    Web框架的本质

    Web服务端的本质就是一个socket服务端,而我们的浏览器就是socket客户端。浏览器发送的请求就是一次socket请求。一次请求获得一次响应,然后就断开,这是一个短连接。

    import socket
    
    def hand_request(conn):
        #建立接收端
        data = conn.recv(1024)
        conn.send('HTTP/1.1 200 OK
    
    '.encode('utf-8')) #这里是浏览器解释的内容,先不用知道
        conn.send("<h1>hello word!</h1>".encode('utf-8'))
    
    def main():
        #建立发送端
        server = socket.socket()
        server.bind(("localhost",8000))
        server.listen(5)
        #持续监听
        while True:
            conn,addr = server.accept()
            hand_request(conn)
            conn.close()
    if __name__ == "__main__":
        main()

    然后打开本机的浏览器访问我们的Web服务。在地址栏输入 http://127.0.0.1:8000/http://localhost:8000/ 之后,浏览器上就会显示服务端返回的内容了。

    上述通过socket来实现了其本质,而对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序。服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理。应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务

    WSGI

    WSGI(Web Server Gateway Interface),是一种规范。它定义了使用python编写的web app与web server,实现web app与web server间的解耦。其实就是封装了一个socket。

    python标准库提供的独立WSGI服务的模块称为wsgiref。

    # !/usr/bin/env python
    # _*_coding:utf-8_*_
    from wsgiref.simple_server import make_server
    
    def RunServer(environ, start_response):
        # environ:封装了客户端发来的所有的数据
        # start_response:封装了要返回给用户的数据,响应头和响应状态
        start_response('200 OK', [('Content-Type', 'text/html')])
        # 返回给客户端的内容,用return返回。记得要转成bytes类型
        return ['<h1>Hello, web!</h1>'.encode('utf-8'), ]
    
    if __name__ == '__main__':
        httpd = make_server('', 8000, RunServer)  # 创建服务,不需要我们自己创建socket服务了
        print("Serving HTTP on port 8000...")
        httpd.serve_forever()  # 运行服务

    响应不同的url请求

    通常我们的请求可能要访问的是网站中的某个页面,比如是这样的形式 http://localhost:8000/data 。这需要在服务端能够区别出不同的请求,然后给客户端返回不同的内容。

    environ,封装了客户端发来的所有的数据,现在来找一下请求的数据具体在哪里。
    在上面例子中的 RunServer 函数中添加断点,然后Debug模式启动。此时再用上面的url发起请求。

    展开 environ 后,可以找到 PATH_INFO 内存放的就是 '/data' ,也就是我们请求的页面。在函数内判断一下 environ['PATH_INFO'] 的值,就可以在里面自定义自己的web框架

    自定义Web框架

    自己写一个web框架

    from wsgiref.simple_server import make_server
    
    def index():
        return 'index'
    
    def login():
        return 'login'
    
    def home():
        return 'home'
    
    def routers():
        urlpatterns = (
            ('/index',index)
            ('/login',login)
            ('/home',home)
        )
        return urlpatterns
    
    def RunServer(environ, start_response):
        # environ:封装了客户端发来的所有的数据
        # start_response:封装了要返回给用户的数据,响应头和响应状态
        start_response('200 OK', [('Content-Type', 'text/html')])
        url = environ['PATH_INFO']
        urlpatterns = routers()
        func = None
        for item in urlpatterns:
            if item[0] == url:
                func = item[1]
                break
        if func:
            return func()
        else:
            return "404 not found"
    
    if __name__ == '__main__':
        httpd = make_server('', 8000, RunServer)  # 创建服务,不需要我们自己创建socket服务了
        print("Serving HTTP on port 8000...")
        httpd.serve_forever()  # 运行服务
    View Code

    Web框架

    MVC框架

    web_server.py
    ├─Model
    │  └─get_data.py
    ├─View
    │  └─index.html
    └─Contraller
        └─account.py

    MVC(Model View Controller 模型-视图-控制器)的Web架构

    MTV框架

    另外还有一种,MTV(Model Templates View 模型-模板-视图)。也就是把MVC中的View分成了视图(展现哪些数据)和模板(如何展现)2个部分,而Contorller这个要素由框架自己来实现了,我们需要做的就是把(带正则表达式的)URL对应到视图就可以了,通过这样的URL配置,系统将一个请求发送到一个合适的视图。 Django就是基于这个框架写的

  • 相关阅读:
    配置sonar、jenkins进行持续审查
    maven命令解释
    Maven中-DskipTests和-Dmaven.test.skip=true的区别
    maven之一:maven安装和eclipse集成
    Eclipse安装Maven插件
    IntelliJ IDEA单元测试和代码覆盖率图解
    关于Spring中的<context:annotation-config/>配置
    Java开发之@PostConstruct和@PreConstruct注解
    Java定时任务的三种实现方法
    JAVA之Mybatis基础入门二 -- 新增、更新、删除
  • 原文地址:https://www.cnblogs.com/Aline2/p/10050655.html
Copyright © 2020-2023  润新知