• 了解web框架


    Web框架前戏

    Web框架本质

    web框架本质上可以看成是一个功能强大的socket服务端,用户的浏览器可以看成是拥有可视化界面的socket客户端。两者通过网络请求实现数据交互,学者们也可以从架构层面上先简单的将Web框架看做是对前端、数据库的全方位整合

    纯手撸web框架 

    1.搭建socket服务端

    1. import socket
    2. server = socket.socket()
    3. server.bind(('127.0.0.1', 8082))
    4. server.listen(5)
    5. while True:
    6. sock, addr = server.accept()
    7. data = sock.recv(1024)
    8. # 此处一会儿需要按照步骤2、3做修改
    9. sock.send(b'hello world')

    2.浏览器发送请求

    1. # 服务端响应的数据需要符合HTTP响应格式
    2. sock.send(b'HTTP1.1 200 OK\r\n\r\n hello world')

    3.路由对应响应

    1. # 将客户端请求相关数据先转成字符串
    2. data_str = data.decode('utf8')
    3. # 研究发现可以采用字符串切割获取路由
    4. current_path = data_str.split(' ')[1]
    5. # 根据后缀的不同返回不同的内容
    6. if current_path == '/login':
    7. sock.send(b'hello login!!!')
    8. elif current_path == '/register':
    9. sock.send(b'hello register')
    10. else:
    11. sock.send(b'404 error')

    总结

    1. """
    2. 纯手撸框架缺陷:
    3. 1.socket代码过于重复(每次搭建服务端都需要反复造轮子)
    4. 2.针对HTTP请求数据没有完善的处理方式(目前只能定向切割)
    5. """

    基于wsgiref模块搭建web框架

    1.模块封装功能

    1. from wsgiref import simple_server
    2. def run(request, response):
    3. """
    4. :param request: 请求相关的数据
    5. :param response: 响应相关的数据
    6. :return: 返回给客户端的展示数据
    7. """
    8. response('200 OK', []) # 固定编写 无需掌握    
    9. return [b'hello world']
    10. if __name__ == '__main__':
    11. server = simple_server.make_server('127.0.0.1', 8080, run)
    12. '''监听本机8080端口 一旦有请求访问 自动触发run方法的执行'''
    13. server.serve_forever()
    14. # 模块封装了socket代码并将请求数据处理成诸多k:v键值对

    2.路由对应响应

    1. # run函数体中添加下列代码
    2. current_path = request.get("PATH_INFO")
    3. if current_path == '/login':
    4. return [b'hello login html']
    5. elif current_path == '/register':
    6. return [b'hello register html']
    7. return [b'404 error']

    3.路由拆分流程

    1.当有很多路由和响应的情况下不可能无限制编写if判断语句,应该设置对应关系并动态调用
    1. def register(request):
    2. return 'register'
    3. def login(request):
    4. return 'login'
    5. def error(request):
    6. with open(r'templates/error.html', 'r', encoding='utf8') as f:
    7. return f.read()
    8. urls = (
    9. ('/login',login),
    10. ('/register',register)
    11. )
    12. def run(request, response):
    13. func_name = None
    14. for url_tuple in urls:
    15. if current_path == url_tuple[0]:
    16. # 先获取对应的函数名
    17. func_name = url_tuple[1]
    18. # 一旦匹配上了 后续的对应关系就无需在循环比对了
    19. break
    20. # for循环运行完毕之后 func_name也有可能是None
    21. if func_name:
    22. res = func_name(request)
    23. else:
    24. res = error(request) # 顺手将request也传给函数 便于后续数据的获取
    25. return [res.encode('utf8')]

    2.根据功能的不同拆分成不同的py文件

    views.py

      --存储路由与函数对应关系

    1. # 功能函数
    2. def register(request):
    3. return 'register'
    4. def login(request):
    5. return 'login'
    6. def index(request):
    7. return 'index'
    8. def error(request):
    9. with open(r'templates/error.html', 'r', encoding='utf8') as f:
    10. return f.read()

    -urls.py

      --存储函数

    1. from views import *
    2. # 后缀匹配
    3. urls = (
    4. ('/register', register),
    5. ('/login', login),
    6. ('/index', index),
    7. )

    -server.py

      --存储启动及分配代码

    1. from wsgiref import simple_server
    2. from urls import urls
    3. from views import error
    4. def run(request, response):
    5. response('200 OK', [])
    6. current_path = request.get("PATH_INFO")
    7. func_name = None
    8. for url_tuple in urls: # ('/register', register)
    9. if current_path == url_tuple[0]:
    10. func_name = url_tuple[1]
    11. break
    12. if func_name:
    13. res = func_name(request)
    14. else:
    15. res = error(request)
    16. return [res.encode('utf8')]
    17. if __name__ == '__main__':
    18. server = simple_server.make_server('127.0.0.1', 8080, run)
    19. server.serve_forever()

    总结:拆分后好处在于要想新增一个功能,只需要在views.py中编写函数,urls.py添加对应关系即可

    3.模板文件与静态文件

    -templates文件夹

      --存储html文件

    -static文件夹

      --存储html页面所需静态资源(后续详细讲解或自行百度)

    Jinja2模板语法

    1.页面展示当前时间

    1. def get_time(request):
    2. # 1.获取当前时间
    3. import time
    4. c_time = time.strftime('%Y-%m-%d %X')
    5. # 2.读取html文件
    6. with open(r'templates/get_time.html','r',encoding='utf8') as f:
    7. data = f.read()
    8. # 3.思考:如何给字符串添加一些额外的字符串数据>>>:字符串替换
    9. new_data = data.replace('random_str',c_time)
    10. return new_data
    1. <h1>展示后端获取的时间数据h1>
    2. <span>random_strspan>

    2.jinja2模板语法

    第三方模块需要先下载后使用
    pip3 install jinja2
    功能阐述:支持将数据传递到html页面并提供近似于后端的处理方式简单快捷的操作数据

    -views.py

    1. from jinja2 import Template
    2. def get_dict(request):
    3. user_dict = {'name': 'jason', 'pwd': 123, 'hobby': 'read'}
    4. new_list = [11, 22, 33, 44, 55, 66]
    5. with open(r'templates/get_dict.html', 'r', encoding='utf8') as f:
    6. data = f.read()
    7. temp_obj = Template(data)
    8. res = temp_obj.render({'user':user_dict,'new_list':new_list})
    9. return res

    -templates

      --get_dict.html

    1. 字典数据展示

    2. {{ user }}

    3. {{ user.name }}

    4. {{ user['pwd'] }}

    5. {{ user.get('hobby') }}

    6. 列表数据展示

    7. {% for i in new_list%}
    8. 元素:{{ i }}
    9. {% endfor %}

    框架请求流程

    主要关键字

    1. urls.py
    2. 后缀与函数名对应关系
    3. ('/index',register)
    4. 后缀专业名词称之为'路由'
    5. 函数名专业名词称之为'视图函数'
    6. urls.py专业名词称之为'路由层'
    7. views.py
    8. 专门编写业务逻辑代码
    9. 可以是函数 也可以是类
    10. 函数专业名词称之为'视图函数'
    11. 类专业名词称之为'视图类'
    12. views.py专业名词称之为'视图层'
    13. templates文件夹
    14. 专门存储html文件
    15. html文件专业名词称之为'模板文件'
    16. templates文件夹专业名词称之为'模板层'
    17. static文件夹
    18. 专门存储静态文件资源
    19. 页面所需css文件、js文件、图片文件、第三方文件可统称为'静态资源'

    Django框架简介

    python主流web框架

    1. django
    2. 大而全 自带的功能非常的多 但是有时候会略显笨重
    3. 类似于'航空母舰'
    4. flask
    5. 小而精 自带的功能非常的少 但是第三方模块非常的多
    6. 类似于'游骑兵'
    7. # flask的第三方模块加到一起甚至比django还多 并且也越来越像django
    8. # flask由于过多的依赖于第三方模块 有时候也会受制于第三方模块
    9. tornado
    10. 异步非阻塞框架 速度极快 甚至可以用于充当游戏服务器
    11. # 还有一些占比较小 但是也很厉害的框架
    12. fastapi、sanic......
    13. """
    14. 框架的核心逻辑几乎是一致的 我们在学习的时候只需要先学会一种
    15. 之后就可以触类旁通 但是需要强调的是:千万不用同时学习!!!
    16. """

    django框架版本

    1. django3.X:自带异步功能
    2. django2.X:默认不支持异步
    3. django1.X:默认不支持异步
    4. '''
    5. 学习基于django1.X版本即可原因: 老项目中使用频率最高、最广泛的版本!!!
    6.   与2.X功能几乎一致,后续会讲解两者区别之处
    7.   与3.X最主要的区别在于新增了一个异步的功能
    8. '''

    框架下载

    1. pip3 install django==1.11.11
    2. '''如果之前下载了其他版本不用管 自动替换!!!'''

    注意事项

    1. 计算机名称不要出现中文
    2. python解释器版本不同可能会出现启动报错
    3. 项目中所有的文件名称不要出现中文
    4. 多个项目文件尽量不要嵌套,做到一项一夹

    启动如果报错,根据提示找到修改widgets.py文件第152行源码,删除最后的逗号即可 

    基本使用

    1.验证是否下载成功

    cmd窗口直接输入django-admin有一长串结果展示表明成功(需提前配置解释器环境变量)

    2.常见操作命令

    1. # 1.创建django项目
    2. django-admin startproject 项目名(如:mysite)
    3. # 2.启动django项目
    4. cd 项目名(如:mysite)
    5. python3 manage.py runserver IP:PORT
    6. '''IP:PORT可以不写 默认在本地8000端口起服务'''
    7. # 3.创建app应用
    8. python3 manage.py startapp 应用名(jason01)

    3.应用的概念

    django框架相当于是一所大学,应用相当于是大学里面的各个学院
      大学相当于是个空壳子     负责提供环境
      学院才是一个个真正具备特定功能的集合

    eg:
      使用django写一个淘宝,淘宝里面有很多功能模块
      我们应该先创建一个空的django项目然后根据功能的不同创建不同的应用
      django项目
        应用名01(user)      用户相关业务
        应用名02(order)    订单相关业务
        应用名03(goods)     产品相关业务
        应用名04(backend)        后台相关业务

    主要文件

    -mysite文件夹名称

      --mysite同名文件夹

        ----settings.py        项目配置文件

        ----urls.py          总路由层

      --manage.py           项目入口文件

      --db.sqlite3             运行项目后自动创建(django自带的小型数据库)

      --应用文件夹           通过命令创建(可以创建任意个数)

        ----migrations文件夹     存储数据迁移记录

        ----admin.py         django提供的后台管理

        ----apps.py          用于配置文件的应用注册(创建的应用都需要去配置文件中注册)

        ----models.py         模型层(与数据库相关)

        ----views.py          视图层(编写当前应用核心业务逻辑代码)

        ----tests.py           自带的测试文件

  • 相关阅读:
    win10配置CenterNet环境
    原生js 实现table表格
    Redis主从复制流程
    FTP文件传输服务器原理
    rocketmq总结
    TypeScript实战之用TS封装Axios
    .net 使用Docker开发
    torch 神经网络模型构建
    服务器搭建远程Jupyter环境
    QCheckBox、margin、border、pandding、QHoxLayout、QSplitter
  • 原文地址:https://blog.csdn.net/m0_71115526/article/details/134289504