Django基础(Django预热---服务端原理)

引言:

  由第一版一点一点的引入Django,从底层开始讲解。

第一版底层使用socket模块启动服务

"""
先启动服务,监听
    while 1:
        等待连接...

        3. 接收到你的请求
        4. 根据你的需求,返回相应的内容
        断开
"""

import socket
sk = socket.socket()
sk.bind(("127.0.0.1", 8080))  # 绑定IP和端口
sk.listen()  # 监听

while 1:
    # 等待链接
    conn, add = sk.accept()
    data = conn.recv(8096)  # 接收客户端发来的消息
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
    conn.send(b'object')
    conn.close()

第二版根据URL中不同的路径返回不同的内容

"""
根据URL中不同的路径返回不同的内容

"""

import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 8080))
sk.listen()  # 监听

while 1:
    # 等待链接
    conn, addr = sk.accept()
    data = conn.recv(8096)  # 接收客户端发来的消息
    # 从data中取到路径
    data = str(data, encoding='utf8')  # 把收到的字节类型的数据转换成字符串
    print(data)
    # 按\r\n分割
    data1 = data.split("\r\n\r\n")[0]
    print(data1)
    url = data1.split()[1]
    print("url:", url)
    print('*'*120)
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
     # 根据不同的路径返回不同内容
    if url == "/index/":
        response = b"index"
    elif url == "/main/":
        response = b"main"
    else:
        response = b"404"
    conn.send(response)
    conn.close()

第二版代码示例

第三版根据URL中不同的路径返回不同的内容(页面封装成函数版)

"""
根据URL中不同的路径返回不同的内容
"""

import socket
sk = socket.socket()
sk.bind(("127.0.0.1", 8080))  # 绑定IP和端口
sk.listen()  # 监听


# 将返回不同的内容部分封装成函数
def index(url):
    s = "这是{}页面!".format(url)
    return bytes(s, encoding="utf8")


def home(url):
    s = "这是{}页面!".format(url)
    return bytes(s, encoding="utf8")


while 1:
    # 等待连接
    conn, add = sk.accept()
    data = conn.recv(8096)  # 接收客户端发来的消息
    # 从data中取到路径
    data = str(data, encoding="utf8")  # 把收到的字节类型的数据转换成字符串
    # 按\r\n分割
    data1 = data.split("\r\n")[0]
    url = data1.split()[1]
    print("url:", url)
    print("*" * 120)

    conn.send(b'HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n')  # 因为要遵循HTTP协议
    # 根据不同的路径返回不同内容
    if url == "/index/":
        response = index(url)
    elif url == "/home/":
        response = home(url)
    else:
        response = b"404 not found!"

    # 具体的响应体
    conn.send(response)
    conn.close()

第三版代码

第四版根据URL中不同的路径返回不同的内容(页面封装成函数且调用函数使用反射版)

"""
根据URL中不同的路径返回不同的内容
函数进阶版
"""

import socket
sk = socket.socket()
sk.bind(("127.0.0.1", 8080))  # 绑定IP和端口
sk.listen()  # 监听

# 将返回不同的内容部分封装成函数

def index(url):
    s = "这是{}页面!".format(url)
    return bytes(s, encoding="utf8")

def home(url):
    s = "这是{}页面!".format(url)
    return bytes(s, encoding="utf8")

# 定义一个url和实际要执行的函数的对应关系

lis = [
    ("/index/", index),
    ("/main/", home),
]


while 1:
    # 等待连接
    conn, addr = sk.accept()
    date = conn.recv(8096)  # 接收客户端发来的消息
    # 从data中取到路径
    date = str(date, encoding="utf8")  # 把收到的字节类型的数据转换成字符串
    # 按\r\n分割
    date1 = date.split("\r\n")[0]
    url = date1.split()[1]
    conn.send(b'HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n')  # 因为要遵循HTTP协议
    # 根据不同的路径返回不同内容
    func = None
    for i in lis:
        if i[0] == url:
            func = i[1]
            break
    if func:
        response = func(url)
    else:
        response = b"404 not found!"
    # 具体的响应体
    conn.send(response)
    conn.close()

第四版代码

第五版根据URL中不同的路径返回不同的内容(页面封装成函数且调用函数使用反射并返归HTML页面版)

"""
根据URL中不同的路径返回不同的内容
函数进阶版
返回HTML页面
"""

import socket
sk = socket.socket()
sk.bind(("127.0.0.1", 8080))  # 绑定IP和端口
sk.listen()  # 监听


# 将返回不同的内容部分封装成函数
def index(url):
    with open("index.html", "r", encoding="utf8") as f:
        s = f.read()
    return bytes(s, encoding="utf8")


def home(url):
    with open("home.html", "r", encoding="utf8") as f:
        s = f.read()
    return bytes(s, encoding="utf8")


# 定义一个url和实际要执行的函数的对应关系
list1 = [
    ("/index/", index),
    ("/home/", home),
]

while 1:
    # 等待连接
    conn, add = sk.accept()
    data = conn.recv(8096)  # 接收客户端发来的消息
    # 从data中取到路径
    data = str(data, encoding="utf8")  # 把收到的字节类型的数据转换成字符串
    # 按\r\n分割
    data1 = data.split("\r\n")[0]
    url = data1.split()[1]
    print("url:", url)
    print("*" * 120)

    conn.send(b'HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n')  # 因为要遵循HTTP协议
    # 根据不同的路径返回不同内容
    func = None
    for i in list1:
        if i[0] == url:
            func = i[1]
            break
    if func:
        response = func(url)
    else:
        response = b"404 not found!"

    # 具体的响应体
    conn.send(response)
    conn.close()

第五版代码

第六版根据URL中不同的路径返回不同的内容(页面封装成函数且调用函数使用反射并返归动态HTML页面版)

"""
根据URL中不同的路径返回不同的内容
函数进阶版
返回HTML页面
动态起来
"""

import socket
import time

sk = socket.socket()
sk.bind(("127.0.0.1", 8080))  # 绑定IP和端口
sk.listen()  # 监听


# 将返回不同的内容部分封装成函数
def home(url):
    with open("home.html", "r", encoding="utf8") as f:
        s = f.read()
        now = str(time.time())
        s = s.replace("¥¥¥¥", now)
    return bytes(s, encoding="utf8")


def index(url):
    with open("home.html", "r", encoding="utf8") as f:
        s = f.read()
    return bytes(s, encoding="utf8")


# 定义一个url和实际要执行的函数的对应关系
list1 = [
    ("/index/", index),
    ("/home/", home),
]

while 1:
    # 等待连接
    conn, add = sk.accept()
    data = conn.recv(8096)  # 接收客户端发来的消息
    # 从data中取到路径
    data = str(data, encoding="utf8")  # 把收到的字节类型的数据转换成字符串
    # 按\r\n分割
    data1 = data.split("\r\n")[0]
    url = data1.split()[1]
    print("url:", url)
    print("*" * 120)

    conn.send(b'HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n')  # 因为要遵循HTTP协议
    # 根据不同的路径返回不同内容
    func = None
    for i in list1:
        if i[0] == url:
            func = i[1]
            break
    if func:
        response = func(url)
    else:
        response = b"404 not found!"

    # 具体的响应体
    conn.send(response)
    conn.close()

第六版代码

第七版根据URL中不同的路径返回不同的内容(页面封装成函数且调用函数使用反射并返归动态HTML页面同时使用wsgiref模块版)

"""
根据URL中不同的路径返回不同的内容
函数进阶版
返回HTML页面
动态起来
wsgiref模块版
"""

import time
from wsgiref.simple_server import make_server


# 将返回不同的内容部分封装成函数
def index(url):
    with open("index.html", "r", encoding="utf8") as f:
        s = f.read()
        now = str(time.time())
        s = s.replace("@@oo@@", now)
    return bytes(s, encoding="utf8")


def home(url):
    with open("home.html", "r", encoding="utf8") as f:
        s = f.read()
    return bytes(s, encoding="utf8")


# 定义一个url和实际要执行的函数的对应关系
list1 = [
    ("/index/", index),
    ("/home/", home),
]


def run_server(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ])  # 设置HTTP响应的状态码和头信息
    url = environ['PATH_INFO']  # 取到用户输入的url

    func = None
    for i in list1:
        if i[0] == url:
            func = i[1]
            break
    if func:
        response = func(url)
    else:
        response = b"404 not found!"
    return [response, ]

if __name__ == '__main__':
    httpd = make_server('127.0.0.1', 8090, run_server)
    print("Serving HTTP on port 8090...")
    httpd.serve_forever()

第七版代码

第八版根据URL中不同的路径返回不同的内容(页面封装成函数且调用函数使用反射并返归动态HTML页面同时使用wsgiref模块和jinja2模块版)

"""
根据URL中不同的路径返回不同的内容
函数进阶版
返回HTML页面
动态起来
wsgiref模块版和jinja2模块
"""

import time
from wsgiref.simple_server import make_server
import jinja2


# 将返回不同的内容部分封装成函数
def index(url):
    with open("index.html", "r", encoding="utf8") as f:
        s = f.read()
        now = str(time.time())
        s = s.replace("@@oo@@", now)
    return bytes(s, encoding="utf8")


def home(url):
    with open("home.html", "r", encoding="utf8") as f:
        s = f.read()
    return bytes(s, encoding="utf8")


def human(url):
    with open("human.html", "r", encoding="utf8") as f:
        s = f.read()
        template = jinja2.Template(s)  # 生成一个jinja2的Template(模板)对象
        data = {"name": "zz", "hobby_list": ["足球", "篮球", "平棒球"]}
        response = template.render(data)  # 本质上是完成了字符串的替换
    return bytes(response, encoding="utf8")




# 定义一个url和实际要执行的函数的对应关系
list1 = [
    ("/index/", index),
    ("/home/", home),
    ("/human/", human),
]


def run_server(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ])  # 设置HTTP响应的状态码和头信息
    url = environ['PATH_INFO']  # 取到用户输入的url

    func = None
    for i in list1:
        if i[0] == url:
            func = i[1]
            break
    if func:
        response = func(url)
    else:
        response = b"404 not found!"
    return [response, ]

if __name__ == '__main__':
    httpd = make_server('127.0.0.1', 8090, run_server)
    print("Serving HTTP on port 8090...")
    httpd.serve_forever()

第八版代码

第九版根据URL中不同的路径返回不同的内容(页面封装成函数且调用函数使用反射并返归动态HTML页同时使用wsgiref模块和jinja2模块与数据库版)

"""
根据URL中不同的路径返回不同的内容
函数进阶版
返回HTML页面
动态起来
wsgiref模块版和jinja2模块和pymysql
"""

import time
from wsgiref.simple_server import make_server
import jinja2
import pymysql


# 将返回不同的内容部分封装成函数
def index(url):
    with open("index.html", "r", encoding="utf8") as f:
        s = f.read()
        now = str(time.time())
        s = s.replace("@@oo@@", now)
    return bytes(s, encoding="utf8")


def home(url):
    with open("home.html", "r", encoding="utf8") as f:
        s = f.read()
    return bytes(s, encoding="utf8")


def human(url):
    with open("human.html", "r", encoding="utf8") as f:
        s = f.read()
        template = jinja2.Template(s)  # 生成一个jinja2的Template(模板)对象
        # data = {"name": "xx", "hobby_list": ["对子", "篮球", "足球"]}

        conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="123456", db="userinfo", charset="utf8")
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
        cursor.execute("SELECT name, hobby FROM user")
        user = cursor.fetchone()
        cursor.close()
        conn.close()
        print("user:", user)
        print("*" * 120)

        hobby_list = user["hobby"].split()
        user["hobby_list"] = hobby_list
        print(user)
        print("-" * 120)
        response = template.render(user)  # 本质上是完成了字符串的替换
    return bytes(response, encoding="utf8")




# 定义一个url和实际要执行的函数的对应关系
list1 = [
    ("/index/", index),
    ("/home/", home),
    ("/human/", human),
]


def run_server(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ])  # 设置HTTP响应的状态码和头信息
    url = environ['PATH_INFO']  # 取到用户输入的url

    func = None
    for i in list1:
        if i[0] == url:
            func = i[1]
            break
    if func:
        response = func(url)
    else:
        response = b"404 not found!"
    return [response, ]

if __name__ == '__main__':
    httpd = make_server('127.0.0.1', 8090, run_server)
    print("Serving HTTP on port 8090...")
    httpd.serve_forever()

第九版代码








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值