python 使用 wsgiref 手撸web 框架

1. 入口文件, 负责启用服务, 转发请求

from wsgiref.simple_server import make_server
from urls.urls import urls


def run(env, response):
    """
        env: 请求相关的数据
        request: 响应相关的数据
        return: 返回给用户端的数据
    """
    request_path = env.get("PATH_INFO")
    func = None
    if request_path in urls:
        func = urls[request_path]
    elif '.css' in request_path or '.js' in request_path:
        func = urls['/static_file']
    if func:
        response('200 OK', [])
        return_str = func(env)
        return [return_str.encode('utf-8')]
    else:
        response('200 OK', [])
        return [b'404 NOT FOUND']


if __name__ == '__main__':
    server = make_server("127.0.0.1", 8888, run)
    server.serve_forever()

2. urls.py 负责将请求地址和对应的处理函数关联起来

from views.views import *

urls = {
    "/index": index,
    "/hello": hello,
    "/book_manage": book_manage,
    '/static_file': static_file
}

3. views.py 处理函数, 负责处理对应的请求

from myutils.db import db
from jinja2 import Template


def index(env):
    return "index"


def hello(env):
    with open('templates/hello.html', 'r', encoding="utf-8") as f:
        return f.read()


def book_manage(env):
    with open('templates/book_manage.html', 'r', encoding="utf-8") as f:
        conn, cursor = db()
        sql = "select * from tb_books"
        cursor.execute(sql)
        result = cursor.fetchall()
        html = Template(f.read()).render(books=result)
        return html


def static_file(env):
    request_filt_path = env.get("PATH_INFO")[1:]
    with open("templates/" + request_filt_path, 'r', encoding="utf-8") as f:
        return f.read()

4. db.py 一个工具方法, 没封装成类

def db():
    import pymysql
    conn = pymysql.connect(host="127.0.0.1",
                           user="root",
                           passwd="yyjeiq",
                           database="fmg",
                           charset="utf8")

    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    return conn, cursor

5. templates 下面的 book_manage.html, 静态文件, 使用 jinja2 动态获取数据库的 books

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>图书管理系统</title>
    <link rel="stylesheet" href="./css/bootstrap.min.css">
    <script src="./js/jquery.min.js"></script>
    <script src="./js/bootstrap.min.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
    </style>
</head>

<body>
    <div class="container_fluid">
        <nav class="navbar navbar-inverse">
            <div class="container-fluid">
                <!-- Brand and toggle get grouped for better mobile display -->
                <div class="navbar-header">
                    <button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
                        data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
                        <span class="sr-only">Toggle navigation</span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                    </button>
                    <a class="navbar-brand" href="#">图书管理系统</a>
                </div>

                <!-- Collect the nav links, forms, and other content for toggling -->
                <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                    <ul class="nav navbar-nav">
                        <li class="active"><a href="#">书籍<span class="sr-only">(current)</span></a></li>
                        <li><a href="#">作者</a></li>
                        <li class="dropdown">
                            <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button"
                                aria-haspopup="true" aria-expanded="false">更多 <span class="caret"></span></a>
                            <ul class="dropdown-menu">
                                <li><a href="#">Action</a></li>
                                <li><a href="#">Another action</a></li>
                                <li><a href="#">Something else here</a></li>
                                <li role="separator" class="divider"></li>
                                <li><a href="#">Separated link</a></li>
                                <li role="separator" class="divider"></li>
                                <li><a href="#">One more separated link</a></li>
                            </ul>
                        </li>
                    </ul>
                    <form class="navbar-form navbar-left">
                        <div class="form-group">
                            <input type="text" class="form-control" placeholder="Search">
                        </div>
                        <button type="submit" class="btn btn-default">Submit</button>
                    </form>
                    <ul class="nav navbar-nav navbar-right">
                        <li><a href="#">明光</a></li>
                        <li class="dropdown">
                            <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button"
                                aria-haspopup="true" aria-expanded="false">更多操作 <span class="caret"></span></a>
                            <ul class="dropdown-menu">
                                <li><a href="#">Action</a></li>
                                <li><a href="#">Another action</a></li>
                                <li><a href="#">Something else here</a></li>
                                <li role="separator" class="divider"></li>
                                <li><a href="#">Separated link</a></li>
                            </ul>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
    </div>


    <div class="container_fluid">
        <div class="row" style="margin: 0;">
            <div class="col-md-3">
                <div class="list-group">
                    <a href="#" class="list-group-item active">
                        图书列表
                    </a>
                    <a href="#" class="list-group-item">作者列表</a>
                    <a href="#" class="list-group-item">出版社列表</a>
                    <a href="#" class="list-group-item">妹子图列表</a>
                    <a href="#" class="list-group-item">更多精彩</a>
                </div>
            </div>
            <div class="col-md-9">
                <div class="panel panel-primary">
                    <!-- Default panel contents -->
                    <div class="panel-heading">图书列表</div>

                    <!-- Table -->

                    <div class="row" style="padding: 12px;">
                        <div class="col-md-5" style="margin: 12px;">
                            <div class="input-group">
                                <input type="text" class="form-control" placeholder="Search for...">
                                <span class="input-group-btn">
                                    <button class="btn btn-default" type="button">Go!</button>
                                </span>
                            </div>
                        </div>
                    </div>

                    <div class="table_box" style="padding: 30px;">
                        <table class="table table-hover table-border">
                            <tr>
                                <th>id</th>
                                <th>书名</th>
                                <th>作者</th>
                                <th>出版社</th>
                            </tr>
                            {% for i in books %}
                            <tr>
                                <td>{{ i.id }}</td>
                                <td>{{ i.name }}</td>
                                <td>{{ i.author }}</td>
                                <td>{{ i.isbn }}</td>
                            </tr>
                            {% endfor %}
                        </table>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>

</html>

6. 数据库内容

7. 访问结果

 

最后bb一句: bootstrap YYDS

posted @ 2022-05-08 20:05  深海里的星星i  阅读(98)  评论(0)    收藏  举报