advPython-3

搭建简易的Web框架

手动搭建

import socket

server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5)

while True:
    conn, addr = server.accept()
    data = conn.recv(1024)
    data = data.decode('utf-8')  # 二进制数据转为字符串
    conn.send(b'HTTP/1.1\r\n\r\n')  # TCP协议特性,可以粘包
    current_path = data.split(' ')[1]

    if current_path == '/apple':
        conn.send(b'Apple is here!')

    elif current_path == '/banana':
        conn.send(b'Banana is here!')

    elif current_path == '/html':
        with open(r'html_file_path', 'rb') as f:  # 发送html文件
            conn.send(f.read())

    else:
        conn.send(b'404~ sorry~')
    conn.close()

基于wsgiref模块搭建

# 基于wsgiref模块,搭建Web框架
from wsgiref.simple_server import make_server


def error(env):
    return "404 error"


def tomato(env):
    return "tomato"


def apple(env):
    return "apple"


def banana(env):
    return "banana"


# url与函数的对应关系
urls = [
    ('/tomato', tomato),
    ('/apple', apple),
    ('/banana', banana),
]


def run(env, response):
    """
    env:请求相关的所有数据,它将数据处理并封装成字典,让使用者更方便操作
    response:响应相关的所有数据
    return:返回给浏览器的数据
    """
    response('200 OK', [])  # 响应首行,响应头
    current_path = env.get('PATH_INFO')  # 获取用户输入的地址

    for url in urls:
        if current_path == url[0]:
            res = url[1](env)
            return [res.encode('utf-8')]
    return [error(env).encode('utf-8')]


if __name__ == '__main__':
    server = make_server('127.0.0.1', 8080, run)
    """
    会实时监听127.0.0.1:8080地址,只要客户端来了
    都会交给run函数处理(加括号触发run函数的运行 )
    """
    server.serve_forever()  # 启动服务端

# 动态网页制作
import datetime


def get_time(env):
    current_time = datetime.datetime.now().strftime('%Y-%m-%d %X')
    print(current_time)
    # 如何将后端的"时间数据"传递给html文件呢?
    with open(r'html_file_path', 'r', encoding='utf-8') as f:
        data = f.read()  # data是一堆字符串(字符串内容:html文件)
    data = data.replace('html文件里面的abcdefg', current_time)  # 将abcdefg字符替换为时间current_time再发给前端
    return data  # 当前发送的html文件数据使得网页不再是静态,而是动态的了,
    # 因为html文件数据每次都变化,它的数据是实时获取的,或者说,因为部分数据需要实时修改,所有整体数据是实时更新的


# 动态网页进阶
from jinja2 import Template
def get_dict(env):
    info_dic = {'username': 'tomato', 'age': 18}
    with open('html_file_path','r',encoding='utf-8')as f:
        data = f.read()
    temp = Template(data) # 将"data数据"转换成Template可处理的数据,并赋值给变量temp
    # 调用render功能,查找temp里面的是否有{{user}},有则将info_dic给它,从而更新了数据,将修改完毕的数据赋值给变量res
    res = temp.render(user=info_dic)
    return res

"""
这时,我们需要在对应的html文件里面,加上{{user}}。
那么,以后这个东西将会被后端"jinja2模块"检测到,并替换对应的数据或功能.

结合上面的代码,可以举个例子,如:
html文件里面写入{{user}}  -------------------后端会将它变为--->  'username': 'tomato', 'age': 18
html文件里面写入{{user.get('username')}}  ---后端会将它变为--->  tomato
"""

Python主流Web框架

Django

基本认识

  • Django是一个高级的、全功能的 Web 框架
  • 被广泛用于构建复杂而强大的 Web 应用程序
  • 它提供了许多内置的功能和工具,如管理员界面、身份验证、数据库ORM等
  • 使开发者能够快速构建稳定、可扩展的应用程序

简单概要

  • 特点:大而全,自带的功能特别多(即:庞然大物)
  • 不足:有时候显得笨重

Flask

基本认识

  • Flask 是一个简约而灵活的微型Web框架
  • 专注于构建小型或中型的 Web 应用程序和 API
  • 相比于 Django,Flask更加轻量级
  • 并允许开发者根据需要选择所需的插件和库,以便在项目中进行定制

简单概要

  • 特点:自带的功能非常少,但是它第三方的模块超级多
  • 不足:比较依赖第三方的开发者,而且兼容性问题不容小觑

Tornado

基本认识

  • Tornado 并没有被完全淘汰出三大主流框架之一
  • 尽管 Django 和 Flask 是 Python 生态系统中最受欢迎的 Web 框架,但 Tornado 仍然有其独特的优势和用途
  • Tornado 是一个高性能的异步Web框架,它以支持并发处理和非阻塞IO操作为目标
  • 它经常用于构建高度可扩展且具有实时响应需求的应用程序,例如聊天应用、实时消息传递系统和实时分析工具等
  • 由于其出色的性能和强大的异步功能,Tornado 在特定场景下仍然被广泛使用
  • 虽然 Django 和 Flask 更加通用、适用于各种类型的 Web 应用程序
  • 但 Tornado 的专长在于处理大量并发连接和实时性要求较高的应用

简单概要

  • 特点:异步非阻塞,支持高并发(甚至可以开发游戏服务器)
  • 不足:它只是一个异步框架,只适合特定场景

Web框架总结

    我们从手动搭建web框架中可知,框架主要是下面部分组成
        A部分:socket部分
        B部分:路由与视图函数对应关系(路由匹配)
        C部分:模板语法

    django
        A部分用的是别人的(wsgiref模块)
        B部分用的是自己的
        C部分用的是自己的(没有jinja2模块好用,但是也很方便)

    flask
        A部分用的是别人的(werkzeug,而werkzeug内部还是wsgiref模块)
        B部分用的是自己的
        C部分用的是别人的(jinja2模块)

    tornado
        A、B、C部分都是自己写的

你可能感兴趣的:(Python进阶,python)