• Web框架


    Web 框架

    对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个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
    
    ".encode())
        client.send("Hello, Seven".encode())
    
    def main():
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.bind(('localhost', 8000))
        sock.listen(5)
        while True:
            connection, address = sock.accept()
            handle_request(connection)
            connection.close()
    
    
    if __name__ == '__main__':
        main()

    WSGI

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

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

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

    自定义框架

    实例

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

    #!/usr/bin/env python
    # coding:utf-8
    from wsgiref.simple_server import make_server
    
    def index():
        return ['<H1>index</H1>'.encode(),]
    
    def login():
        return ['<H1>login<H1>'.encode(),]
    
    def routers():
        urlpatterns = (
            ('/index/', index),
            ('/login/', login),
        )
        return urlpatterns
    
    def RunServer(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        url = environ['PATH_INFO']
        print(url)
        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'.encode(),]
    
    if __name__ == '__main__':
        httpd = make_server('localhost', 8000, RunServer)
        print("Serving HTTP on port 8000...")
        httpd.serve_forever()

    模板替换

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

    使用开源工具jinja2,遵循其指定语法,可以实现对HTML文本替换

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <h1>{{name}}</h1>
    
        <ul>
            {% for item in user_list %}
            <li>{{item}}</li>
            {% endfor %}
        </ul>
    
    </body>
    </html>
     

    server

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
     
    from wsgiref.simple_server import make_server
    from jinja2 import Template
     
     
    def index():
        # return 'index'
     
        # template = Template('Hello {{ name }}!')
        # result = template.render(name='John Doe')
     
        f = open('index.html')
        result = f.read()
        template = Template(result)
        data = template.render(name='John Doe', user_list=['alex', 'eric'])
        return data.encode('utf-8')
     
     
    def login():
        # return 'login'
        f = open('login.html')
        data = f.read()
        return data
     
     
    def routers():
     
        urlpatterns = (
            ('/index/', index),
            ('/login/', login),
        )
     
        return urlpatterns
     
     
    def run_server(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, run_server)
        print "Serving HTTP on port 8000..."
        httpd.serve_forever()

    WEB框架模型

    MVC‘

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

    MTV

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

  • 相关阅读:
    JAVA---File递归遍历文件目录,输出绝对路径
    JAVA--Map集合
    (笔记)JAVA--集合实现斗地主洗牌、发牌、看牌(利用TreeSet排序)
    SVN简单使用
    System.Object
    动态创建控件
    select 查询
    数据类型
    入门(值得注意的地方)
    错误调式 异常处理
  • 原文地址:https://www.cnblogs.com/gareth-yu/p/11515177.html
Copyright © 2020-2023  润新知