纯手撸web框架
| 1.web框架的本质 |
| 理解1:连接前端与数据库的中间介质 |
| 理解2:socket服务端 |
| 2.手写web框架 |
| 1.编写socket服务端代码 |
| 2.浏览器访问响应无效>>>:HTTP协议 |
| 3.根据网址后缀的不同获取不同的页面内容 |
| 4.想办法获取到用户输入的后缀>>>:请求数据 |
| 5.请求首行 |
| GET /login HTTP/1.1 |
| GET请求 |
| 朝别人索要数据 |
| POST请求 |
| 朝别人提交数据 |
| 6.处理请求数据获取网址后缀 |
| """ |
| 1.scoket代码过于重复 |
| 2.针对请求数据处理繁琐 |
| 3.后缀匹配逻辑过于LowB |
| """ |
| import socket |
| |
| sever = socket.socket() |
| server.bind(('127.0.0.1', 8080)) |
| server.listen(5) |
| |
| while True: |
| sock, address = server.accept() |
| data = sock.recv(1024) |
| print(data.decode('utf8')) |
| sock.send(b'HTTP/1.1 200 Ok\r\n\r\n'hello big baby) |
| data_str = data.decode('utf8'0) |
| target_ur1 = data_str.split(' ')[1] |
| |
| if target_url == '/index': |
| |
| with open(r'myhtml01.html','rb') as f: |
| sock.send(f.read()) |
| elif target_url == '/login': |
| sock.send(b'login page') |
| else: |
| sock.send(b'home page!') |
基于wsgiref模块
| 内置模块 很多web框架底层使用的模块 |
| 功能1: 封装了scoket代码 |
| 功能2:处理了请求数据 |
| |
| 1.固定代码启动服务端 |
| 2.查看代码之后的request大字典 |
| 3.根据不同的网址后缀返回不同的内容>>>:研究大字典键值对 |
| 4.立刻解决上述纯收录的两个问题 |
| 5.针对最后一个问题代码如何优化 |
| |
| from wigsiref.simple_server import make_server |
| |
| |
| def run(requset, response): |
| """ |
| :param request: 请求相关数据 |
| :param response: 响应相关数据 |
| :return: 返回给客户端的真实数据 |
| """ |
| response('200 OK', []) |
| print(request) 是一个处理之后的大字典 |
| path_info = request.get('PATH_INFO') |
| if path_info == '/index': |
| return [b'index'] |
| elif path_info == '/login': |
| return [b'login'] |
| return [b'hello wsgiref module'] |
| |
| |
| if __name__ == '__main__': |
| server = make_server('127.0.0.1',8080,run) |
| server.serve_forever() |
代码封装优化
| 1.网址后缀的匹配问题 |
| 2.每个后缀匹配成功后执行的代码有多有少 |
| 面条版 函数版 模块版 |
| 3.将分支的代码封装成一个个函数 |
| 4.将网址后缀与函数名做对应关系 |
| 5.获取网址后缀循环匹配 |
| 6.如果想新增功能只需要先写函数再添加一个对应关系即可 |
| 7.根据不同的功能拆分成不同的py文件 |
| views.py 存储核心业务逻辑(功能函数) |
| urls.py 存储网址后缀与函数名对应关系 |
| templates目录 存储html页面文件 |
| 8.为了使函数体代码中业务逻辑有更多的数据可用 |
| 将request大字典转手传给这个函数(可用不用但是不能没有) |
动静态网页
| 动态网页 |
| 页面数据来源于后端 |
| 静态网页 |
| 网页数据直接写死 |
| |
| 1.访问某个网址后缀 后端代码获取当前时间 并将该时间传到html文件上在返回给浏览器展示给用户看 |
| 读取html内容(字符串类型) 然后利用字符串替换 最后再返回给浏览器 |
| |
| 2.将字典传递给页面内容 并且再页面上还可以通过类似于后端的操作方式操作该数据 |
| 模块语法>>>:jinjia2模块 |
jinjia2模块
| pip3 install jinja2 |
| |
| from jinja2 import Template |
| |
| def get_dict_func(request): |
| user_dict = {'name': 'jason', 'age': 18, 'person_list': ['阿珍', '阿强', '阿香', '阿红']} |
| with open(r'templates/get_divt_page.html','r',encoding='utf8') as f: |
| data = f.read() |
| temp_obj = Template(data) |
| return res |
| |
| <p>{{ d1 }}</p> |
| <p>{{ d1.name }}</p> |
| <p>{{ d1['age'] }}</p> |
| <p>{{ d1.get('person_list') }}</p> |
前端、后端、数据库三者联动
| 1.前端浏览器访问get_user 后端连接数据库查询use表中所有数据 传递到某个html页面 弄好样式 再发送给浏览器展示 |
| |
| {% for user_dict in user_data_list %} |
| <tr> |
| <td>{{ user_dict.id }}</td> |
| <td>{{ user_dict.name }}</td> |
| <td>{{ user_dict.age }}</td> |
| </tr> |
| {% endfor %} |
python主流web框架
| 1.django |
| 大而全 自身自带的功能组件非常的多 类似于航空母舰 |
| 2.flask |
| 小而精 自身自带的功能组件非常的少 类似于游骑兵 |
| 几乎所有的功能都需要依赖于第三方模块 |
| 3.tornado |
| 异步非阻塞 速度极快效率极高甚至可以充当游戏服务端 |
| ps:sanic、fastapi... |
django简介
| 1.版本问题 |
| django1.X:同步 1.11 |
| django2.X:同步 2.2 |
| django3.X:支持异步 3.2 |
| django4.X:支持异步 4.2 |
| ps:版本之间的差异其实不大 主要是添加了额外的功能 |
| |
| 2.运行django注意事项 |
| 1.django项目中所有的文件名目录名不要出现中文 |
| 2.计算机名称尽量也不要出现中文 |
| 3.一个pycharm尽量就是一个完整的项目(不要嵌套 不要叠加) |
| 4.不同版本的python解释器与不同版本的django可能会出现小问题 |
django基本使用
| 1.下载 |
| pip3 install django 默认最新版 |
| pip3 install django==版本号 指定版本 |
| pip3 install django==2.2.22 |
| pip下载模块会自动解决依赖问题(会把关联需要用到的模块一起下了) |
| 2.验证 |
| django-admin |
| 3.常见命令 |
| 1.创建django项目 |
| django-admin startproject 项目名 |
| 2.启动django项目 |
| cd 项目名 |
| python38 manage.py runserver ip:port |
| 4.pycharm自动创建django项目 |
| 会自动创建templates文件夹 但是配置文件中可能会报错 |
| os.path.join(BASE_DIR,'templates') |
django app的概念
| django类似于是一所大学 app类似于大学里面的各个学院 |
| |
| django里面的app类似于某个具体的功能模块 |
| user app 所有用户相关的都写在user app下 |
| goods app 所有商品相关的都写在goods app下 |
| |
| 命令行创建应用 |
| python38 manage.py startapp 应用名 |
| pycharm创建应用 |
| 新建django项目可以默认创建一个 并且自动注册 |
| """ |
| 创建的app一定要去settings.py中注册 |
| INSTALLED_APPS = [ |
| 'app01.apps.App01Config', |
| 'app02' |
| ] |
| """ |
django主要目录结构
| django项目目录名 |
| django项目同名目录 |
| settings.py 配置文件 |
| urls.py 存储网址后缀与函数名对应关系(不严谨) |
| wsgi.py wsgiref网关文件 |
| db.sqlite3文件 django自带的小型数据库(项目启动之后才会出现) |
| manage.py 入口文件(命令提供) |
| 应用目录 |
| migrations目录 存储数据库相关记录 |
| admin.py django内置的admin后台管理功能 |
| apps.py 注册app相关 |
| models.py 与数据库打交道的(非常重要) |
| tests.py 测试文件 |
| views.py 存储功能函数(不严谨) |
| templates目录 存储html文件(命令行不会自动创建 pycharm会) |
| 配置文件中还需要配置路径 |
| [os.path.join(BASE_DIR,'templates'),] |
| |
| """ |
| 网址后缀 路由 |
| 函数 视图函数 |
| 类 视图类 |
| 重要名词讲解 |
| urls.py 路由层 |
| views.py 视图层 |
| models.py 模型层 |
| templates 模板层 |
| """ |
django小白必会三板斧
| from django.shortcuts import render,HttpResponse,redirect |
| |
| HttpResponse 返回字符串类型的数据 |
| |
| render 返回html页面并且支持传值 |
| |
| redirect 重定向 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构