• Django底层原理简介与安装


    Django环境目录搭建一栏:

    利用wsgiref模块封装好的socket搭建服务端:

    #利用wsgiref模块封装好的socket演示操作(例如accept
    ecv)
    #也可以实现socket服务端的功能
    
    from wsgiref.simple_server import make_server
    #拆分开之后需要导入关联相应表格
    import my_urls
    from views import *
    
    #分到views里面
    # def index(response):
    #     return 'ok'
    #
    # def time(response):
    #     return 'time'
    #
    # def error(response):
    #     return '404'
    
    #分到my_urls里面
    # urls=[
    #     ('/index',index),
    #     ('/time',time),
    #
    # ]
    
    def my_server(environ,start_response):
        #这里就不需要再accept、recv了,因为封装好了,只需要对接收数据进行处理就好
        #environ是个字典:把请求头里所有的东西都切割出来了,不用再手动进行处理
        #start_response是个函数:响应头信息HTTP/1.1 200 OK
    Content-Type:text/html
    
    
    
        #取请求的地址:
        # print(environ['PATH_INFO'])  # 'PATH_INFO': '/ ',默认是空 类似于:GET /index HTTP/1.1 访问时输入什么就会返回什么
    
        # conn.send(b'HTTP/1.1 200 OK
    Content-Type:text/html
    
    ')类似于这个功能
        start_response('200 OK',[('Content-Type','text/html')])
        # return [b'Hello wsgiref_socket']  #到这里就可以模拟MyWeb.py里面的socket服务端功能了
    
    
        func=None
        #遍历取出路由列表里面的各个元组值
        # for url in urls:
        for url in my_urls.urls:
    
            #判断用户请求的地址是不是写在路由里面的地址
            if url[0] == environ['PATH_INFO']:
                func=url[1]  #相当与 func=index 或者 func=time
                break
        #判断是否为空
        if func:
            response=func(environ)  #即 index(environ)
        else:
            response=error(environ)
    
            #wsgiref规定返回值就是要写在列表里面
        return [response,]
    
    
    if __name__ == '__main__':
        my=make_server('127.0.0.1',8002,my_server)
        print('监听8002端口')
        my.serve_forever()

    my_urls路由配置:

    import views
    
    urls=[
        ('/index',views.index),
        ('/time',views.time),
        ('/user_list',views.user_list),
        ('/favicon.ico',views.favicon)
    
    ]

    templates渲染html模板(和路由层对应):

    1.index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>index界面</title>
    </head>
    <body>
        <img src="https://goss.veer.com/creative/vcg/veer/1600water/veer-136737644.jpg" alt="index">
    </body>
    </html>

    2.time.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        @@time@@
    </body>
    </html>

    3.user_list.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>用户列表</title>
        <style>
            th {
                background: gray;
            }
            td {
    
                border: 1px solid  black;
                 200px;
                height: 50px;
                text-align: center;
            }
            th {
                border: 1px solid  black;
                 200px;
                height: 50px;
                text-align: center;
            }
        </style>
    </head>
    <body>
        <table style="border: 1px solid black;border-collapse: collapse;">
            <thead>
            <tr>
                <th>id</th>
                <th>用户名</th>
                <th>密码</th>
    
            </tr>
            </thead>
            <tbody>
                {% for user in user_list %}
                <tr>
                    <td>{{user.id}}</td>
                    <td>{{user.name}}</td>
                    <td>{{user.password}}</td>
                </tr>
    
                {%endfor%}
            </tbody>
    
        </table>
    </body>
    </html>

    views视图配置:

    import pymysql
    #jinja2是模板渲染(用于去渲染user_list.html中的文件)
    from jinja2 import  Template
    
    
    #把wsgiref里面的time index error 函数拆分过来
    
    def index(response):
        # return 'ok'
        #从template里面调取网页(里面设定要响应返回给客户端的内容)
        with open('templates/index.html','r',encoding='utf-8') as f:
            data=f.read()
        return  data.encode('utf-8')
    
    
    def time(response):
        # return 'time'
        import datetime
        now = datetime.datetime.now().strftime('%Y-%m-%d %X')
        with open('templates/two.html', 'r', encoding='utf-8') as f:
            data = f.read()
        data = data.replace('@@time@@',now)
        return data.encode('utf-8')
    
    def error(response):
        return '404'.encode('utf-8')
    
    def favicon(request):
        with open('favicon.ico','rb') as f:
            data=f.read()
        return data
    
    
    def user_list(response):
        conn=pymysql.connect(
            host='127.0.0.1',
            port=3306,
            user='root',
            password='root',
            database='test'
    
        )
    
        #不传参拿到是元组,传参之后得到的是字典
        cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
        cursor.execute('select * from user')
        user_list=cursor.fetchall()
        print(user_list)  #user_list列表[{'id':1,'name':yangzhizong,'password':123},{...}]
    
        #取到user_list.html模板
        with open('templates/user_list.html','r',encoding='utf-8') as f:
            data=f.read()
    
        #jinja2的应用,生成一个模板对象,需要传字符串
        template=Template(data)   #template是个对象,就是user_list.html
        data=template.render(user_list=user_list)  #调用对象的render方法,传入参数完成对html文件的渲染
        return data.encode('utf-8')

    待完善。。。

  • 相关阅读:
    bzoj 3238
    bzoj 3473 后缀自动机多字符串的子串处理方法
    bzoj 2998 第k小字串
    bzoj 3672 利用点分治将CDQ分治推广到树型结构上
    bzoj 3671 贪心
    NOIP模拟题——nan
    NOIP模拟题——kun(栈)
    hduP2586——How far away ?
    DP习题
    NOIP模拟题——来自风平浪静的明天
  • 原文地址:https://www.cnblogs.com/yangzhizong/p/9545940.html
Copyright © 2020-2023  润新知