Django底层原理简介与安装

Django环境目录搭建一栏:

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

#利用wsgiref模块封装好的socket演示操作(例如accept\recv)
#也可以实现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\r\nContent-Type:text/html\r\n\r\n

    #取请求的地址:
    # print(environ['PATH_INFO'])  # 'PATH_INFO': '/ ',默认是空 类似于:GET /index HTTP/1.1 访问时输入什么就会返回什么

    # conn.send(b'HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n')类似于这个功能
    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;
            width: 200px;
            height: 50px;
            text-align: center;
        }
        th {
            border: 1px solid  black;
            width: 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')

待完善。。。

猜你喜欢

转载自www.cnblogs.com/yangzhizong/p/9545940.html
今日推荐