了解Web框架

了解Web框架

1、web框架

web框架主要简化开发操作,方便我们的web网站开发,不需要一直做重复性的操作。

所有的web框架的本质都是一个socket服务端;用户通过浏览器进行访问数据,浏览器就是socket的客户端。

2、基于 socket 实现web框架

python 复制代码
import  socket

# 创建 socket 服务端对象
server = socket.socket()
# 绑定 ip 以及 端口号(1024 ~ 65535)
server.bind(('127.0.0.1' , 8080))
server.listen(5)
while True:
    sock , address = server.accept()
    data = sock.recv(1024)
    print(data)
    '''
    127.0.0.1 发送的响应无效
    是因为服务端和客户端之间发送和接收数据的传输协议不同
    浏览器访问数据是:通过 http协议获取数据
    
    http协议(http1.0 , http1.1)
    数据响应格式
    1、响应首行 (http协议版本 , 响应状态码 响应状态) 200 OK
    2、响应头 (键值对方式显示)
    3、\r\n (空行)
    4、响应体 (我们要响应的数据)
    '''
    # 127.0.0.1 发送的响应无效。
    sock.send('HTTP1.1 200 OK \r\n\r\n'.encode('utf-8'))
    sock.send(b'hello')
    sock.send('阿宸好帅'.encode('gbk'))

# 浏览器访问数据是:通过 http协议获取数据
# url , 浏览器资源获取器
# 127.0.0.1:8686/index
# 127.0.0.1:8686/num/1
python 复制代码
import  socket

# 创建 socket 服务端对象
server = socket.socket()
# 绑定 ip 以及 端口号(1024 ~ 65535)
server.bind(('127.0.0.1' , 8080))
server.listen(5)

# 视图函数
def index():
    return bytes('index页面' , encoding='gbk')

def ac():
    return bytes('阿宸好帅', encoding='gbk')

# url 路由
url_dict = {
    '/index':index,
    '/ac':ac
}

while True:
    sock , address = server.accept()
    data = sock.recv(1024).decode('utf-8')
    url = data.split(' ')[1]
    '''
    127.0.0.1 发送的响应无效
    是因为服务端和客户端之间发送和接收数据的传输协议不同
    浏览器访问数据是:通过 http协议获取数据
    
    http协议(http1.0 , http1.1)
    数据响应格式
    1、响应首行 (http协议版本 , 响应状态码 响应状态) 200 OK
    2、响应头 (键值对方式显示)
    3、\r\n (空行)
    4、响应体 (我们要响应的数据)
    '''
    # 127.0.0.1 发送的响应无效。
    sock.send('HTTP1.1 200 OK \r\n\r\n'.encode('utf-8'))
    if url in url_dict:
        func = url_dict[url]()
        sock.send(func)
    else:
        sock.send(b'404')

3、基于wsgiref模块

WSGI是一个标准规范,web服务器的网关接口,定义web服务器和python程序进程交互

wsgiref模块中封装了 socket服务器操作 ,处理数据请求和响应的协议

Django开发环境中就需要用到这个模块来作为服务器。

python 复制代码
from wsgiref.simple_server import make_server

# 视图函数
def index():
    return bytes('index页面' , encoding='gbk')

def ac():
    return bytes('阿宸好帅', encoding='gbk')

# url 路由
url_dict = {
    '/index':index,
    '/ac':ac
}

# 响应服务
def run_server(environ , response):
    '''
    :param environ: 接收请求去相关的所有数据 , wsgiref模块将http请求的数据封装成字典进行传输
    :param response: 响应的数据
    :return: 返回给客户端的数据 , 以列表的形式返回
    '''
    # 响应状态码 , 响应头
    response('200 OK', [])
    # 获取url进行匹配响应
    url = environ['PATH_INFO']
    if url in url_dict:
        response_data = url_dict[url]()
    else:
        response_data = b'404'

    return [response_data]

if __name__ == '__main__':
    # 实例化服务进程
    httpd = make_server('127.0.0.1',8989,run_server)
    # 启动服务
    httpd.serve_forever()

4、动静态网页

1.静态网页

静态文件:所有的前端文件都是静态文件

静态网页:前端的文件中不需要从后端获取数据。

python 复制代码
from wsgiref.simple_server import make_server

# 视图函数
def info():
    # 1、读取html文件
    with open('info.html' , 'r' , encoding='utf-8') as f:
        data = f.read()
    return bytes(data.encode('utf-8'))


# url 路由
url_dict = {
    '/index':info,
}

# 响应服务
def run_server(environ , response):
    '''
    :param environ: 接收请求去相关的所有数据 , wsgiref模块将http请求的数据封装成字典进行传输
    :param response: 响应的数据
    :return: 返回给客户端的数据 , 以列表的形式返回
    '''
    # 响应状态码 , 响应头
    response('200 OK', [])
    # 获取url进行匹配响应
    url = environ['PATH_INFO']
    if url in url_dict:
        response_data = url_dict[url]()
    else:
        response_data = b'404'

    return [response_data]

if __name__ == '__main__':
    # 实例化服务进程
    httpd = make_server('127.0.0.1',8989,run_server)
    # 启动服务
    httpd.serve_forever()

2.动态网页

动态网页:前端的文件中需要从后端获取数据

将html文件进行模板化,将其转换为字符串模板 , 可以在html文件中写近似后端的语法

复制代码
pip install jinja2
python 复制代码
from wsgiref.simple_server import make_server
from jinja2 import Template
import time , pymysql

# 视图函数
def info():
    # 1、读取html文件
    with open('info.html' , 'r' , encoding='utf-8') as f:
        data = f.read()
    return bytes(data.encode('utf-8'))

def get_time():
    data_time = time.strftime(f"{'%Y'}年{'%m'}月{'%d'}日 {'%H'}时{'%M'}分{'%S'}秒")
    with open('index.html' , 'r' , encoding='utf-8') as f:
        data = f.read()
    # Template 对html页面进行模板化 , 转换成后端可以操作的方式
    temp = Template(data)
    # render 将后端数据专递到模板化后端 html文件中 {html_time : data_time}
    res = temp.render(html_time = data_time)
    return bytes(res.encode('utf-8'))

def get_data():
    db = pymysql.connect(
        host='localhost',
        user='root',
        password='root',
        charset='utf8',
        database='demo'
    )
    # 设置游标 , 将返回获取的数据类型修改为字典类型
    cur = db.cursor(cursor=pymysql.cursors.DictCursor)
    sql = 'select * from t_hero'
    cur.execute(sql)
    db_data = cur.fetchall()

    with open('hero.html' , 'r' , encoding='utf-8') as f:
        data = f.read()
    # Template 对html页面进行模板化 , 转换成后端可以操作的方式
    temp = Template(data)
    # render 将后端数据专递到模板化后端 html文件中 {html_time : data_time}
    res = temp.render(t_hero = db_data)
    return bytes(res.encode('utf-8'))


# url 路由
url_dict = {
    '/time':get_time,
    '/info':info,
    '/hero' : get_data
}

# 响应服务
def run_server(environ , response):
    '''
    :param environ: 接收请求去相关的所有数据 , wsgiref模块将http请求的数据封装成字典进行传输
    :param response: 响应的数据
    :return: 返回给客户端的数据 , 以列表的形式返回
    '''
    # 响应状态码 , 响应头
    response('200 OK', [])
    # 获取url进行匹配响应
    url = environ['PATH_INFO']
    if url in url_dict:
        response_data = url_dict[url]()
    else:
        response_data = b'404'

    return [response_data]

if __name__ == '__main__':
    get_data()
    # 实例化服务进程
    httpd = make_server('127.0.0.1',8989,run_server)
    # 启动服务
    httpd.serve_forever()
html 复制代码
<body>
<table border="1">
    <tr>
        <th>name</th>
        <th>identity</th>
        <th>weapon</th>
        <th>Shunt</th>
    </tr>
    {% for data in t_hero %}
    <tr>
        <th>{{ data.name }}</th>
        <th>{{ data.identity }}</th>
        <th>{{ data.weapon }}</th>
        <th>{{ data.Shunt }}</th>
    </tr>
    {% endfor %}
</table>
</body>

下载Django框架

python的版本:3.7 , 3.8 , 3.9

python 复制代码
pip install django==3.2
相关推荐
weixin_382395232 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__2 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.3 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~4 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华4 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子6 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅7 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni7 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学8 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端