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

  • 相关阅读:
    hdu 5119 Happy Matt Friends
    hdu 5128 The E-pang Palace
    hdu 5131 Song Jiang's rank list
    hdu 5135 Little Zu Chongzhi's Triangles
    hdu 5137 How Many Maos Does the Guanxi Worth
    hdu 5122 K.Bro Sorting
    Human Gene Functions
    Palindrome(最长公共子序列)
    A Simple problem
    Alignment ( 最长上升(下降)子序列 )
  • 原文地址:https://www.cnblogs.com/wulaoer/p/5256150.html
Copyright © 2011-2022 走看看