了解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
相关推荐
熊的猫1 小时前
JS 中的类型 & 类型判断 & 类型转换
前端·javascript·vue.js·chrome·react.js·前端框架·node.js
瑶琴AI前端1 小时前
uniapp组件实现省市区三级联动选择
java·前端·uni-app
会发光的猪。1 小时前
如何在vscode中安装git详细新手教程
前端·ide·git·vscode
我要洋人死2 小时前
导航栏及下拉菜单的实现
前端·css·css3
科技探秘人3 小时前
Chrome与火狐哪个浏览器的隐私追踪功能更好
前端·chrome
科技探秘人3 小时前
Chrome与傲游浏览器性能与功能的深度对比
前端·chrome
JerryXZR3 小时前
前端开发中ES6的技术细节二
前端·javascript·es6
七星静香3 小时前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
q2498596933 小时前
前端预览word、excel、ppt
前端·word·excel
小华同学ai3 小时前
wflow-web:开源啦 ,高仿钉钉、飞书、企业微信的审批流程设计器,轻松打造属于你的工作流设计器
前端·钉钉·飞书