zoukankan      html  css  js  c++  java
  • Django: 之Web框架完美解析

    Web框架解析

      Web通过Socket来监听客户端,,一旦发现客户发送的信息立刻接受。接受之后在服务端查找客户的请求,找到请求返回给用户,断开。这是一个连接,不断的接收,不断的返回。

    #!/usr/bin/env python
    #coding:utf-8
    
    import socket
    
    def handle_request(client):
        buf = client.recv(1024)
        client.send("HTTP/1.1 200 OK
    
    ")
        client.send("Hello, Wulaoer")
    
    def main():
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.bind(('127.0.0.1',8000))
        sock.listen(5)
    
        while True:
            connection, address = sock.accept()
            handle_request(connection)
            connection.close()
    
    if __name__ == '__main__':
        main()
    

    上述实现了Socket的本质,对于python web程序来说,一般会分为两部分:服务程序和应用程序。服务程序负责对socket服务器进行封装,并在请求到来时,对请求对各种数据进行整理。应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。这样,服务器程序就需要为不同当框架提供不同当支持。这样混乱的局面无论是对于服务器还是框架都是不利的。对服务器来说,需要支持各种不同框架,对框架来说,只有支持它对服务器才能被开发出的应用使用。这个时候,标准化就变得尤为重要。我们就可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么它们就可以配合使用。一旦标准确定,双方各自实现。这样,服务器可以支持更多支持标准的框架,框架也可以使用更多支持标准的服务器。

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

    python标准库提供的独立WSGI服务器为wsgiref。

    #!/usr/bin/env python
    #coding:utf-8
    
    from wsgiref.simple_server import make_server
    
    def RunServer(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        return '<h1>Hello, web!</h1>'
    
    if __name__ == '__main__':
        httpd = make_server('', 8000, RunServer)
        print "Serving HTTP on port 8000..."
        httpd.serve_forever()
    

    自定义Web框架

    一、框架

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

    #!/usr/bin/env python
    #coding:utf-8
    from wsgiref.simple_server import make_server
    
    def wulaoer():
        return 'Hi, How are you wulaoer?'
    
    def laowu():
        return 'Hi, How are you laowu?'
    
    def routers():
    
        urlpatterns = (
            ('/wulaoer/',wulaoer),
            ('/laowu/',laowu),
        )
    
        return urlpatterns
    
    def RunServer(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)
        print "Serving HTTP on port 8000..."
        httpd.serve_forever()
    

    运行结果:

    2、模版引擎

    在上一步骤中,对于所有的wulaoer、laowu均返回给用户浏览器一个简单的字符串,在现实的Web请求中一般会返回一个复杂的符号HTML规则的字符串,所以我们一般将要返回给用户的HTML写在指定文件中,然后再返回。如:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>Hi, how are you laowu!</h1>
    </body>
    </html>
    laowu.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>Hi, how are you wulaoer!</h1>
    </body>
    </html>
    wulaoer.html
    #!/usr/bin/env  python
    # --*--coding:utf-8 --*--
    
    from wsgiref.simple_server import make_server
    from jinja2 import Template
    import time
    '''
    内容展示,先读取打开html在读取内容,展示
    '''
    
    def laowu():
        # return 'Hi, laowu'
        f = open('html/laowu.html')
        data = f.read()
        return data
    
    def wulaoer():
        # return 'Hi, wulaoer'
        f = open('html/wulaoer.html')
        data = f.read()
        return data
    
    '''
    定义路径列表
    '''
    url_list = (
        ('/laowu/',laowu),
        ('/wulaoer/',wulaoer),
    )
    
    
    
    def RunServer(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        url = environ['PATH_INFO']
        func = None
        '''循环列表如果存在就暂时不存在报错404'''
        for item in url_list:
            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)
        print "Serving HTTP on port 8000..."
        httpd.serve_forever()
    

    上述代码只能返回给用户HTML的内容,现实复杂的页面,还是存在问题的:如何给用户返回动态内容?

    自定义一套特殊的语法,进行替换

    使用开源的工具jinja2,遵循其指定语法

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>{{ name }}</h1>
        <ul>
            {% for item in user_list %}
            <li>{{ item }}</li>
            {% endfor %}
        </ul>
    
    </body>
    </html>
    index.html
    #!/usr/bin/env  python
    # --*--coding:utf-8 --*--
    
    from wsgiref.simple_server import make_server
    from jinja2 import Template
    
    '''
    利用read读取html的内容
    '''
    def index():
        f = open('html/index.html')
        result = f.read()
        template = Template(result)
        data = template.render(name='laowu', user_list=['Bom', 'Tom'])
        return data.encode('utf-8')
    
    def laowu():
        # return 'Hi, laowu'
        f = open('html/laowu.html')
        data = f.read()
        return data
    
    def wulaoer():
        # return 'Hi, wulaoer'
        f = open('html/wulaoer.html')
        data = f.read()
        return data
    
    
    url_list = (
        ('/laowu/',laowu),
        ('/index/',index),
        ('/wulaoer/',wulaoer),
    )
    
    
    
    def RunServer(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        url = environ['PATH_INFO']
        func = None
        for item in url_list:
            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)
        print "Serving HTTP on port 8000..."
        httpd.serve_forever()
    

      遵循jinja2的语法规则,其内部会对指定的语法进行相应的替换,从而达到动态的返回内容,对于模版引擎的本质。

    内容参考链接:http://www.cnblogs.com/wupeiqi/articles/5237672.html

  • 相关阅读:
    窗体的扩展样式GWL_EXSTYLE用于SetWindowLong
    内存映射对于大文件的使用
    Delphi实现全局鼠标钩子
    全局键盘钩子(WH_KEYBOARD)
    实现拦截API的钩子(Hook)
    JBoss + EJB3 + MySql : 开发第一个EJB
    取PE文件的引入表和导出表
    Webbrowser中模拟连接点击(非鼠标模拟)
    打造无DLL版穿透防火墙Downloader
    Delphi 常用属性+方法+事件+代码+函数
  • 原文地址:https://www.cnblogs.com/wulaoer/p/5256150.html
Copyright © 2011-2022 走看看