了解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
相关推荐
程序员海军4 分钟前
2024 Nuxt3 年度生态总结
前端·nuxt.js
m0_7482567814 分钟前
SpringBoot 依赖之Spring Web
前端·spring boot·spring
web1350858863543 分钟前
前端node.js
前端·node.js·vim
m0_5127446444 分钟前
极客大挑战2024-web-wp(详细)
android·前端
若川1 小时前
Taro 源码揭秘:10. Taro 到底是怎样转换成小程序文件的?
前端·javascript·react.js
潜意识起点1 小时前
精通 CSS 阴影效果:从基础到高级应用
前端·css
奋斗吧程序媛1 小时前
删除VSCode上 origin/分支名,但GitLab上实际上不存在的分支
前端·vscode
IT女孩儿1 小时前
JavaScript--WebAPI查缺补漏(二)
开发语言·前端·javascript·html·ecmascript
m0_748256564 小时前
如何解决前端发送数据到后端为空的问题
前端
请叫我飞哥@4 小时前
HTML5适配手机
前端·html·html5