zoukankan      html  css  js  c++  java
  • 实现简单的web框架

    实现简单的web框架

    流程:

    服务端启动---服务端等待请求---客户端访问---服务端响应请求
    

      

    代码:

    from wsgiref.simple_server import make_server
    
    
    #处理请求 def application(environ, start_response):
    #响应头 start_response('200 OK', [('Content-Type', 'text/html')])
    #响应内容 return [b'<h1>Hello, web!</h1>']

    # 开始监听HTTP请求:
    httpd = make_server('', 8080, application) print('Serving HTTP on port 8000...') 
    #永久启动服务
    httpd.serve_forever()

      

    详解:

    整个application()函数本身没有涉及到任何解析HTTP的部分,也就是说,底层代码不需要我们自己编写,
    我们只负责在更高层次上考虑如何响应请求就可以了。
    
    application()函数必须由WSGI服务器来调用。有很多符合WSGI规范的服务器,我们可以挑选一个来用。
    
    Python内置了一个WSGI服务器,这个模块叫wsgiref    
        
        
    application()函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:
    
            //environ:一个包含所有HTTP请求信息的dict对象;
            
            //start_response:一个发送HTTP响应的函数。
    
    在application()函数中,调用:
    
    start_response('200 OK', [('Content-Type', 'text/html')])
    
    就发送了HTTP响应的Header,注意Header只能发送一次,也就是只能调用一次start_response()函数。
    start_response()函数接收两个参数,一个是HTTP响应码,一个是一组list表示的HTTP Header,每
    个Header用一个包含两个str的tuple表示。
    
    通常情况下,都应该把Content-Type头发送给浏览器。其他很多常用的HTTP Header也应该发送。
    
    然后,函数的返回值b'<h1>Hello, web!</h1>'将作为HTTP响应的Body发送给浏览器。
    
    有了WSGI,我们关心的就是如何从environ这个dict对象拿到HTTP请求信息,然后构造HTML,
    通过start_response()发送Header,最后返回Body。
    

      

    访问

      

    用户输入不同的url,不同的url做不同的处理

    from wsgiref.simple_server import make_server
    
    
    def application(environ, start_response):
        # 请求头
        start_response('200 OK', [('Content-Type', 'text/html')])
        print("path",environ['PATH_INFO'])
        path=environ['PATH_INFO']
        if path=="/test":
            return [b'<h1>Hello, test!</h1>']
        elif path=="/alex":
            return [b'<h1>Hello, alex!</h1>']
        else:
            return [b"404"]
    
    
    
    httpd = make_server('', 8080, application)
    
    print('Serving HTTP on port 8000...')
    # 开始监听HTTP请求:
    httpd.serve_forever()
    

      

    用户每输入一个路径,我们用一个函数去处理。
    
    from wsgiref.simple_server import make_server
    
    def foo1():
        f=open("index1.html","rb")
        data=f.read()
        return data
    
    def foo2():
        f = open("index2.html", "rb")
        data = f.read()
        return data
    
    def application(environ, start_response):
        # 请求头
        start_response('200 OK', [('Content-Type', 'text/html')])
        print("path",environ['PATH_INFO'])
        path=environ['PATH_INFO']
        if path=="/":
            return [b"Hello Web"]
        if path=="/test":
            return [foo1()]
        elif path=="/alex":
            return [foo2()]
        else:
            return [b"<a>404</a>"]
    
    
    
    httpd = make_server('', 8080, application)
    
    print('Serving HTTP on port 8000...')
    # 开始监听HTTP请求:
    httpd.serve_forever()
    

      

    使用遍历来解决
    
    from wsgiref.simple_server import make_server
    
    
    
    def login(req):
        print(req['QUERY_STRING'])
        return b'welcome'
    
    def signup(req):
        pass
    
    def foo1(req):
        f=open("index1.html","rb")
        data=f.read()
        return data
    
    def foo2(req):
        f = open("index2.html", "rb")
        data = f.read()
        return data
    
    
    def route():
        url_patterns=[("/login",login),
                      ("/signup",signup),
                      ("/test",foo1),
                      ("/alex",foo2)]
        return url_patterns
    
    
    
    def application(environ, start_response):
        # 请求头
        start_response('200 OK', [('Content-Type', 'text/html')])
        print("path",environ['PATH_INFO'])
        path=environ['PATH_INFO']
    #初始化 func=None
    #获得url路由表 url_list=route()
    #遍历 for url in url_list: if url[0]==path: func=url[1] print(func) break
    #如果是路由表里的url则执行相应函数 if func: return [func(environ)] else: return ["<h1>404</h1>".encode("utf8")] httpd = make_server('', 8080, application) print('Serving HTTP on port 8000...') # 开始监听HTTP请求: httpd.serve_forever()

      

  • 相关阅读:
    HDU 4348 To the moon(可持久化线段树)
    HDU 5875 Function 大连网络赛 线段树
    HDU 5877 2016大连网络赛 Weak Pair(树状数组,线段树,动态开点,启发式合并,可持久化线段树)
    HDU 5876 大连网络赛 Sparse Graph
    HDU 5701 中位数计数 百度之星初赛
    CodeForces 708B Recover the String
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    ASP.NET生成验证码
    ASP.NET生成验证码
    ASP.NET生成验证码
  • 原文地址:https://www.cnblogs.com/-wenli/p/10389585.html
Copyright © 2011-2022 走看看