• python使用WSGI接口实现简单网页


    Python Web 介绍

    Python的Web服务器分为服务器程序和应用程序。服务器程序负责接收客户端的请求发送给应用程序,应用程序负责处理请求返回给服务器程序。为了方便应用程序的开发,我们把常用的功能封装起来,成为各种Web开发框架,例如 Django, Flask, Tornado。而框架是需要和服务器程序配合的,为了统一不用的框架,人们建立了一个标准,这就是WSGI。
    WSGI(Web Server Gateway Interface)是应用程序和web服务器之间的一种接口。
    WSGI接口定义非常简单,它只要求Web开发者实现一个函数,就可以响应HTTP请求。我们来看一个最简单的Web版本的“Hello, web!”:

    实现应用程序

    hello.py

    def application(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        return '<h1>Hello, web!</h1>'

    上面的application()函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:
    - environ:一个包含所有HTTP请求信息的dict对象;
    - start_response:一个发送HTTP响应的函数。

    其中的environstart_response是根据位置确定的,可以任意命名

    environ

    其中environ包含但不限于

    REQUEST_METHOD
    HTTP 请求方法,例如 “GET”, “POST”
    SCRIPT_NAME
    URL 路径的起始部分对应的应用程序对象,如果应用程序对象对应服务器的根,那么这个值可以为空字符串
    PATH_INFO
    URL 路径除了起始部分后的剩余部分,用于找到相应的应用程序对象,如果请求的路径就是根路径,这个值为空字符串
    QUERY_STRING
    URL路径中 ? 后面的部分
    CONTENT_TYPE
    HTTP 请求中的 Content-Type 部分
    CONTENT_LENGTH
    HTTP 请求中的Content-Lengh 部分
    SERVER_NAME, SERVER_PORT
    与 SCRIPT_NAME,PATH_INFO 共同构成完整的 URL,它们永远不会为空。但是,如果 HTTP_HOST 存在的话,当构建 URL 时, HTTP_HOST优先于SERVER_NAME。

    要查看完整的信息可以在上面的应用程序里添加

    for key in environ:
        print key
        print environ[key]

    start_response

    start_response参数是一个可调用对象。接受两个位置参数,一个可选参数。
    例如:start_response(status, response_headers, exc_info=None) status参数是状态码,例如 200 OK

    实现服务器程序

    server.py

    # server.py
    # coding=utf-8
    from wsgiref.simple_server import make_server
    # 导入我们自己编写的application函数:
    from hello import application
    
    # 创建一个服务器,IP地址为空,端口是8000,处理函数是application:
    httpd = make_server('', 8000, application)
    print "Serving HTTP on port 8000..."
    # 开始监听HTTP请求:
    httpd.serve_forever()

    执行

    运行server.py

    无论多么复杂的Web应用程序,入口都是一个WSGI处理函数。HTTP请求的所有输入信息都可以通过environ获得,HTTP响应的输出都可以通过start_response()加上函数返回值作为Body。

    复杂的Web应用程序,光靠一个WSGI函数来处理还是太底层了,我们需要在WSGI之上再抽象出Web框架,进一步简化Web开发。

    转载请保留原文链接及作者
    本文标题:
    文章作者: LepeCoder
    发布时间:
    原始链接:
  • 相关阅读:
    HDU 1505 City Game
    HDU 1506 Largest Rectangle in a Histogram
    HDU 1838 Chessboard
    HDU 2512 一卡通大冒险
    HDU 1081 To The Max
    HDU 2845 Beans
    HDU 1422 重温世界杯
    HDU 1231 最大连续子序列
    第6章 接口和实现
    java面向抽象编程样例
  • 原文地址:https://www.cnblogs.com/lepeCoder/p/7230541.html
Copyright © 2020-2023  润新知