zoukankan      html  css  js  c++  java
  • Web框架

    Web框架

    众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。上篇只是返回了一句话,如果是要返回一个图片呢?一个文件呢?这就涉及你自己要负责实现文件的传送了,要自己通过Socket把Http协议里的各种功能都实现,浪费时间。

    对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序。

    1.服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理。

    2.应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。

    不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。我们可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就可以配合使用。一旦标准确定,双方各自实现。这样,服务器可以支持更多支持标准的框架,框架也可以使用更多支持标准的服务器。

    WSGI

    WSGI(Web Server Gateway Interface)是一种规范,它定义了使用python编写的web app与web server之间接口格式,实现web app与web server间的解耦。

    python标准库提供的独立WSGI服务器称为wsgiref。通俗的说:当规范建立后,程序就不再重复编写web server(socket服务端),而是直接使用现成的实现WSGI的模块(例如:wsgiref、uwsgi、werkzeug),从而让程序员更加专注与业务代码。Python的wsgiref是基于WSGI规范封装的模块,我们可以在这个模块基础上开发我们的web server。

    from wsgiref.simple_server import make_server
    def RunServer(environ, start_response):
           ""当有用户在浏览器上访问:http://127.0.0.1:8000/, 立即执行该函数并将函数的返回值返回给用户浏览器
        :param environ: 请求相关内容,比如浏览器类型、版本、来源地址、url等,即客户发来的所有数据
        :param start_response: 响应相关 封装要返回给用户的数据,响应头状态""
        start_response('200 OK', [('Content-Type', 'text/html')])
       
    return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ]
    2.7无字节 转3.x字节 必须把字符串转为字节
    1.b'abc'
    2.bytes('abc',encoding='utf-8')
    3.'abc'.encode('utf-8')
    if __name__ == '__main__': httpd = make_server('', 8000, RunServer)
    ip 端口 自定义函数
    print("Serving HTTP on port 8000...") httpd.serve_forever()
    运行 自动创建Socket服务端 一旦连接上 会触发 RunServer

    自定义Web框架

    通过python标准库提供的wsgiref模块开发一个自己的Web框架

    web server支持多页面

    from wsgiref.simple_server import make_server
     
    def handle_index():"一类可以用正则作为函数,例如翻页"
        return 'index'
     
    def handle_login():
        return 'login'
     
    def routers():
         
        urlpatterns = (
            ('/index/',handle_index),
            ('/login/',handle_login),
        )
         
        return urlpatterns
     
    def RunServer(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        url = environ['PATH_INFO']  ""从断点处拿到用户的url标识""
    urlpatterns
    = routers() "url太多 放在一个列表里 不用一个一个写函数" func = None for item in urlpatterns: func = urlpatterns[item] if func: return func() else: return [bytes('404 not found.',encoding="utf-8"),
    ] 

    if __name__ == '__main__':
    httpd
    = make_server('', 8000, RunServer)
    print "Serving HTTP on port 8000..."
    httpd.serve_forever()

     函数显示页面,要调用html,所以我们一般将要返回给用户的HTML写在指定文件中,然后再返回。

    def index():
        # return 'index'
        f = open('index.html')
        data = f.read()
        return data
     
    def login():
        # return 'login'
        f = open('login.html')
        data = f.read()
        return data

    View:    由于数据去各自的html中拿,html太多放在一个View文件夹中    f = open('View/index.html')

    Controller:   放各个函数     from  Controller  import   account      函数放在account.py

    Model:   数据库相关 的文件夹

    总结

    web框架

    MVC    :    Model 数据库    View模板文件       Controller 业务处理

    MTV    : Model 数据库    Template 业务处理     View模板文件

    Web框架的本质

    1. 浏览器是socket客户端,网站是socket服务端
    2. wsgi,是一个规范,wsgiref实现了这个规范并在其内部实现了socket服务端
    3. 根据 url 的不同执行不同函数,即:路由系统
    4. 函数,即:视图函数
    5. 图片、css、js文件 统一称为静态文件,需要读取内容直接返回给用户浏览器

     

  • 相关阅读:
    如何使用SAP Intelligent Robotic Process Automation自动操作Excel
    OpenSAML 使用引导 IV: 安全特性
    Spring Cloud Zuul 网关使用与 OAuth2.0 认证授权服务
    微服务架构集大成者—Spring Cloud (转载)
    Spring Cloud Eureka 服务注册列表显示 IP 配置问题
    使用 Notification API 开启浏览器桌面提醒
    SignalR 中使用 MessagePack 序列化提高 WebSocket 通信性能
    配置 Nginx 的目录浏览功能
    关于 Nginx 配置 WebSocket 400 问题
    Migrate from ASP.NET Core 2.0 to 2.1
  • 原文地址:https://www.cnblogs.com/hmm1995/p/10013859.html
Copyright © 2011-2022 走看看