目录

1.c/s架构

2.b/s架构

3.基于socket写一个web应用

main.py

index.html

4.手写web框架

main.py

login.html

time.html

user_list.html

user_list_new

二.HTTP协议

1.什么是HTTP协议

2.HTTP协议的作用

3.HTTP版本及区别

4.HTTP协议的特点

5.HTTP请求协议

常用的请求头:

6.HTTP响应协议

常见的HTTP状态码:


1.c/s架构

c/s客户端  —&gt服务端(MySQL是客户端服务端在同一台机器上)

优点:

  1. 客户端服务端直接相连
  2. 客户端可以处理一些逻辑事务
  3. 客户端操作界面       

缺点:

  1. 客户端
            只能处理一些功能单一的多系统
            适用于局域网,对网速要求高
            安装部署困难,不易扩展
  2. 服务器
            用户数增多会出现通信拥堵
            对服务器的要求很高
  3. 用户
            没安装客户端的外部用户不能访问
            用户数受限,不易扩张

2.b/s架构

b/s浏览器—>服务端

优点:

  1. 面向广大的用户实现信息传播共享
  2. 浏览器负担小
  3. 页面更新实时同步
  4. 软件重用性强,节省大量成本

缺点:

  1. 客户端
            页面需要不停的动态刷新,网速慢的情况很费时间
            面对大量不可知用户
  2. 服务器
            用户增多,服务响应
            不能处理复杂功能

*****b/s架构本质上就是c/s架构*****

3.基于socket一个web应用

main.py

import socket

def server_run():
    soc = socket.socket()
    soc.bind(('127.0.0.1', 8008))
    soc.listen(5)
    while True:
        conn, addr = soc.accept()
        recv_data = conn.recv(1024)
        print(recv_data)
        # 1 直接在send里写,发送客户端
        # conn.send(b'HTTP/1.1 200 OKrnrn<h1&gt;hello web</h1&gt;<img src="https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=5e3814acf9edab64607f4592965fc4a6/14ce36d3d539b600c0c465d0eb50352ac65cb74b.jpg"&gt;</img&gt;')
        #2 打开一个html文件发送客户端
        # with open('index.html','r',encoding='utf-8') as f:
        #     data=f.read()
        # conn.send(('HTTP/1.1 200 OKrnrn%s'%data).encode('utf-8'))
        # 3 动态网页字符串替换
        import time
        now=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        print(now)
        with open('index.html','r',encoding='utf-8') as f:
            data=f.read()
        data=data.replace('@@@',now)
        conn.send(('HTTP/1.1 200 OKrnrn%s'%data).encode('utf-8'))
        conn.close()

if __name__ == '__main__':
    server_run()

index.html

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

<img src="https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=5e3814acf9edab64607f4592965fc4a6/14ce36d3d539b600c0c465d0eb50352ac65cb74b.jpg" alt="">
</body>
</html>

4.手写web框架

main.py

import socket

import pymysql
def index(request):
    return '<img src="https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=5e3814acf9edab64607f4592965fc4a6/14ce36d3d539b600c0c465d0eb50352ac65cb74b.jpg"></img>'


def login(request):
    with open('login.html','r',encoding='utf-8') as f :
        data=f.read()
    return data
def time(request):
    import datetime
    now=datetime.datetime.now().strftime('%Y-%m-%d %X')
    with open('time.html','r',encoding='utf-8') as f :
        data=f.read()
    data=data.replace('@@time@@',now)
    return data
def user_list(request):
    # 创建连接
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='lqz')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute("select id,name,password from user")
    user_list = cursor.fetchall()
    cursor.close()
    conn.close()
    tr_list=[]
    for row in user_list:
        tr='<tr><td>%s</td><td>%s</td><td>%s</td></tr>'%(row['id'],row['name'],row['password'])
        tr_list.append(tr)


    with open('user_list.html','r',encoding='utf-8') as f:
        data=f.read()
    data=data.replace('@@body@@',''.join(tr_list))
    return data

def user_list_new(request):
    # 创建连接
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='lqz')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute("select id,name,password from user")
    user_list = cursor.fetchall()
    cursor.close()
    conn.close()
    with open('user_list_new.html','r',encoding='utf-8') as f:
        data=f.read()
    from jinja2 import Template
    template=Template(data)
    response=template.render(user_list=user_list)
    # response=template.render({'user_list':user_list})
    return response


urls = [
    ('/index', index),
    ('/login', login),
    ('/time', time),
    ('/user_list', user_list),
    ('/user_list_new', user_list_new),
]


def run():
    soc = socket.socket()
    soc.bind(('127.0.0.1', 8006))
    soc.listen(5)
    while True:
        conn, port = soc.accept()
        data = conn.recv(1024)
        # data=data.decode('utf-8')
        print(data)
        data = str(data, encoding='utf-8')
        request_list = data.split('rnrn')
        head_list = request_list[0].split('rn')
        method, url, htt = head_list[0].split(' ')
        # conn.send(b'hello web')
        conn.send(b'HTTP/1.1 200 OK rnrn')
        print(url)
        func_name = None
        for u in urls:
            if url == u[0]:
                func_name = u[1]
                break
        if func_name:
            response = func_name(data)
        else:
            response = '404 not found'

        conn.send(response.encode('utf-8'))
        conn.close()


if __name__ == '__main__':
    run()

login.html

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

<form action="">
    <p>用户名:<input type="text"></p>
    <p>密码:<input type="password"></p>


</form>
</body>
</html>

time.html

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


@@time@@
</body>
</html>

user_list.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户列表</title>
</head>
<body>

<table border="1">
    <thead>
        <tr>
            <th>id</th>
            <th>用户名</th>
            <th>密码</th>
        </tr>
    </thead>
    <tbody>
        @@body@@
    </tbody>


</table>

</body>
</html>

user_list_new

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户列表</title>
</head>
<body>
<table border="1">
    <thead>
    <tr>
        <th>id</th>
        <th>name</th>
        <th>password</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>

二.HTTP协议

1.什么是HTTP协议

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)

2.HTTP协议的作用

服务器与本地浏览器之间传输文本的传送协议

3.HTTP版本区别

0.9:功能捡漏,只支持GET方法,只能发送HTML格式字符串

1.1:默认持久连接请求管道化、增加缓存处理、增加Host字段支持断点传输分块传输等。

2.0:二进制分帧、多路复用头部压缩服务推送

3.0:弃用TCP,改用基于UDP协议的QUIC协议代替TCP协议。

4.HTTP协议的特点

  1. 支持客户端/服务端模式
  2. 简单快速客户端向服务端发送请求时,只需要传送请求方式路径(GET、POST、HEAD)
  3. 灵活:HTTP允许传输任意类型数据对象,正在传输的类型由Content-Type加以标记
  4. 连接限制每次连接处理一个请求服务处理完客户请求接收到客户的响应后即断开连接
  5. 状态:协议对于事务处理没有记忆能力,缺少状态意味着如果后续处理需要前面信息则必须重传,这样可能导致每次连接传送的数据量增大,另一方面,在服务器不需要先前信息响应就很快

5.HTTP请求协议

一个HTTP请求报文(也称请求消息)由请求行(request line)、请求头(header)、空行和请求数据(也称请求体)4个部分组

请求行
请求头1
请求头2
……
请求空行
请求体

请求行:由请求字段、URL字段和HTTP协议版本字段三部分组成,用空格分隔

请求行格式:Method空格Request-URL空格HTTP-Version rn

        Method:表示请求方法

        Request-URL:表示一个统一资源标识

        HTTP-Version:表示请求的HTTP协议版本

        rn:表示换行

常用的请求头:

6.HTTP响应协议

HTTP响应也由三个部分组成,分别是:状态行、响应头、空行、响应正文

状态行
响应头1
响应头2
……
响应空行
响应体

状态行:由 协议版本,状态码,[状态码说明] 三部分组成

状态行格式:HTTP-Version空格Status-Code空格Reason-Phrase 

        HTTP-Version表示服务器HTTP协议的版本,例如为HTTP/1.1

        Status-Code表示服务器发回的响应状态代码,例如200

        Reason-Phrase表示状态代码的文本描述

常见的HTTP状态码:

原文地址:https://blog.csdn.net/qq_65852978/article/details/134652077

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_16245.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注