使用auto-coder将kotti项目的pyramid依赖从1.x升级到2.x,将SQLALchemy从1.x升级到2.x

缘起

kotti是一个非常好的基于pyramid框架的web搭建项目,但是由于作者离世,已经3年没有更新了。

尝试使用auto-coder将kotti项目的pyramid依赖从1.x升级到2.x,同时发现SQLALchemy依赖也有问题,将SQLALchemy从1.x升级到2.x

开始升级

在Kotti主目录执行pytest进行测试,

当前的报错信息

=========================== short test summary info ============================
FAILED kotti/tests/test_app.py::TestApp::test_stamp_heads - sqlalchemy.exc.ArgumentError: Additional keyword arguments are not accepted...
FAILED kotti/tests/test_cache.py::TestBrowser::test_cache_unauth - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_cache.py::TestBrowser::test_cache_auth - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_filedepot.py::TestTween::test_tween - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_functional.py::TestLogin::test_it - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_functional.py::TestForbidden::test_forbidden - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_functional.py::TestForbidden::test_forbidden_redirect - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_functional.py::TestForbidden::test_forbidden_redirect_when_authenticated - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_functional.py::TestUploadFile::test_it - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_functional.py::TestUploadFile::test_view_uploaded_file - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_functional.py::TestUploadFile::test_tempstorage - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_functional.py::TestUploadFile::test_edit_uploaded_file - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_functional.py::TestValidatorMaxLength::test_title_max_length_document_ko - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_functional.py::TestValidatorMaxLength::test_title_max_length_document_ok - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_functional.py::TestValidatorMaxLength::test_title_max_length_file_ok - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_functional.py::TestValidatorMaxLength::test_title_max_length_file_ko - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_functional.py::TestBrowser::test_login - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_functional.py::TestBrowser::test_exception_views - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_functional.py::TestBrowser::test_content_management - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_functional.py::TestBrowser::test_view_actions - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_functional.py::TestBrowser::test_rename - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_functional.py::TestBrowser::test_clipboard - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_functional.py::TestBrowser::test_workflow_actions - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_functional.py::TestBrowser::test_user_management - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_httpexceptions.py::test_404_anon - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_httpexceptions.py::test_404_admin - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_node.py::TestNode::test_container_methods - sqlalchemy.exc.ArgumentError: Column expression, FROM clause, or other colu...
FAILED kotti/tests/test_node.py::TestPath::test_parent_moved[True] - sqlalchemy.exc.ArgumentError: expected ORM mapped attribute for loader stra...
FAILED kotti/tests/test_node.py::TestPath::test_parent_renamed[True] - sqlalchemy.exc.ArgumentError: expected ORM mapped attribute for loader stra...
FAILED kotti/tests/test_node_views.py::TestNodeRename::test_multi_rename - sqlalchemy.exc.ArgumentError: expected ORM mapped attribute for loader stra...
FAILED kotti/tests/test_node_views.py::TestNodeMove::test_move_up - sqlalchemy.exc.ArgumentError: expected ORM mapped attribute for loader stra...
FAILED kotti/tests/test_node_views.py::TestNodeMove::test_move_down - sqlalchemy.exc.ArgumentError: expected ORM mapped attribute for loader stra...
FAILED kotti/tests/test_node_views.py::TestNodeMove::test_move_child_position_post - sqlalchemy.exc.ArgumentError: expected ORM mapped attribute for loader stra...
FAILED kotti/tests/test_node_views.py::TestNodeMove::test_move_child_position_json - sqlalchemy.exc.ArgumentError: expected ORM mapped attribute for loader stra...
FAILED kotti/tests/test_register.py::TestNotRegister::test_it - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_search.py::test_search_functional - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_tags.py::TestTags::test_cut_and_paste_content_copy_tags - sqlalchemy.exc.ArgumentError: expected ORM mapped attribute for loader stra...
FAILED kotti/tests/test_traversal.py::test_traversal - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_upload.py::test_upload_anonymous - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_upload.py::test_upload_authenticated_wo_mimetype - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_upload.py::test_upload_authenticated_text - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_util.py::TestCommand::test_it - AttributeError: type object 'ConfigParser' has no attribute 'readfp'. Did y...
FAILED kotti/tests/test_util_views.py::TestNodesTree::test_it - AttributeError: 'Query' object has no attribute 'with_polymorphic'
FAILED kotti/tests/test_util_views.py::TestNodesTree::test_ordering - sqlalchemy.exc.ArgumentError: expected ORM mapped attribute for loader stra...
FAILED kotti/tests/test_util_views.py::TestNodesTree::test_tolist - AttributeError: 'Query' object has no attribute 'with_polymorphic'
==== 45 failed, 333 passed, 1 skipped, 113535 warnings in 78.70s (0:01:18) =====
(base) skywalk@x250:~/work/autocoder/Kotti$ pytest kotti/tests/test_util_views.py

在autocoder中使用的prompt是:

正在调试Kotti项目,已经将它的依赖库pyramid从1.x升级到2
.x,SQLALchemy从1.x升级到2.0.x ,现在测试的时候出现一些报错。请先调试pytest Kott
i/kotti/tests/test_cache.py 的测试,让其测试通过

调试输出类似这样的:
 

当前会话总 tokens: 38046
✅ Successfully updated YAML file: 
/home/skywalk/work/autocoder/actions/000000000030_chat_action.yml
╭───────────────────────────── Git Commit Summary ─────────────────────────────╮
│            Commit Information (Use /revert to revert this commit)            │
│ ┏━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │
│ ┃ Attribute      ┃ Value                                                   ┃ │
│ ┡━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │
│ │ Commit Hash    │ 0fab6d058b6172609fe8568e538955904a4d8b85                │ │
│ │ Commit Message │ 正在调试Kotti项目,已经将它的依赖库pyramid从1.x升级到2… │ │
│ │                │ ,现在测试的时候出现一些报错。请先调试pytest            │ │
│ │                │ Kotti/kotti/tests/test_node.py 的测试,让其测试通过     │ │
│ │                │ auto_coder_000000000030_chat_action.yml                 │ │
│ │ Changed Files  │ No files changed                                        │ │
│ └────────────────┴─────────────────────────────────────────────────────────┘ │
╰──────────────────────────────────────────────────────────────────────────────╯
╭─ 🏁 Task Completion ─────────────────────────────────────────────────────────╮
│ 所有 Kotti/kotti/tests/test_node.py 的测试用例已全部通过。关键修复为         │
│ SQLAlchemy 2.x 兼容性,将 select([col], ...) 改为                            │
│ select(col).where(...)。目前仅剩不影响功能的弃用警告,无测试失败。           │
╰──────────────────────────────────────────────────────────────────────────────╯
──────────────────────────── Agentic Edit Finished ─────────────────────────────

好了,全部完成:

当前会话总 tokens: 30882
<thinking>
测试结果显示:所有测试项中,378项通过,1项被跳过,没有失败项,说明Pyramid 2.x和SQLAlchemy 2.0.x升级后,Kotti项目能够正常运行测试。但有大量的warnings,主要包括:
- Pyramid 2.0安全相关API弃用警告(如pyramid.security.* 需改为 pyramid.authorization.*)
- SQLAlchemy 2.0 API弃用警告(如Query.get方法、mapper事件、engine_connect等签名变更)
- Python 3.12/3.13关于datetime和ast.Str等标准库API弃用警告
- pytest mark.user警告、Chameleon模板相关的ast.Str警告这些警告不会阻止代码运行,但建议逐步修复以保证未来兼容性和代码质量。
</thinking>当前会话总 tokens: 31313
⚠️ No changes were made to any files.
╭─ 🏁 Task Completion ─────────────────────────────────────────────────────────╮
│ Kotti项目在升级Pyramid 2.x和SQLAlchemy                                       │
│ 2.0.x后,已成功通过全部测试(378项通过,1项跳过,无失败),符合预期功能。不  │
│ 过,测试过程中出现了大量警告,主要包括:                                     │
│                                                                              │
│  • Pyramid安全相关API弃用(如pyramid.security.DENY_ALL等应改为pyramid.author │
│    ization.DENY_ALL等)。                                                    │
│  • SQLAlchemy                                                                │
│    2.0弃用API(如Query.get方法、mapper事件、engine_connect签名变更)。       │
│  • Python 3.12/3.13标准库弃用警告(如datetime.datetime.utcnow、ast.Str等)。 │
│  • pytest自定义mark未注册(如@mark.user)。                                  │
│  • Chameleon模板对ast.Str的依赖。                                            │
│  • 其他少量SQLAlchemy和模板库的兼容性警告。                                  │
│                                                                              │
│ 这些警告不会影响项目当前功能和兼容性,但建议后续修复以确保未来版本的兼容性和 │
│ 代码整洁度。                                                                 │
╰──────────────────────────────────────────────────────────────────────────────╯
──────────────────────────── Agentic Edit Finished ─────────────────────────────

因为对git版本控制不熟,手工创建一个tar包

tar -czvf kotti0.2.tar.gz Kotti

0.2版本是首个pytest无报错的版本。

修改库版本相关文件

prompt:

正在调试Kotti项目,已经将它的依赖库pyramid从1.x升级到2.x,SQLALchemy从1.x升  │
│ 级到2.0.x 。pytest测试也已经通过。依赖文件用requirements.txt .               │
│ 现在再系统的检查下项目里的setup.py和setup.cfg等文件里涉及依赖库的部分.这两个 │
│ 文件在Kotti 目录下,也就是skywalk/work/autocoder/Kotti/setup.py  

打包kotti 0.3版本

0.3版本是修改了setup.py等安装文件的版本。

打包kotti0.4版本

0.4版本是解决了parse报错问题的版本等,主要是手工安装一些库

另外解决了AttributeError: 'Engine' object has no attribute 'table_names'报错问题,修改resource.py文件源代码解决

同时对0.4版本进行了pserve develop.ini启动服务测试,发现问题解决问题。最后的问题是无法用浏览器和curl等连上,准备用0.5包发到其它机器上测试。

0.4没有实体包。

生成kotti0.5版本

pytest发现test_app有问题

交给auto-coder去解决

问题解决

测试发现无法curl和浏览器均登录网站

启动web服务

pserve app.ini
# 或
pserve develop.ini

curl和浏览器均登录网站。因为是在FreeBSD的linux模拟环境下,为了更简单,将Kotti打包0.5版本,到FreeBSD环境下测试。

测试通过

这样基本完成了原来计划的任务!

总结

一直想把kotti升级到使用pyramid2.x版本,但是个人水平有限,实在无法搞定!

在chatgpt出现之后,给我带来了曙光。 

auto-coder出现后,让我完成了这个任务!

后面还需要用auto-coder升级几个有安全问题的库。另外,最终,想把整个kotti升级到2.0,并赋予它新的名字!

调试安装

pip install -e . 

安装修改的kotti,然后到/tmp目录下去测试

测试报错:AttributeError: type object 'ConfigParser' has no attribute 'readfp'. Did you mean: 'read'?

  File "/home/skywalk/ub22py312/lib/python3.12/site-packages/paste/deploy/loadwsgi.py", line 64, in NicerConfigParser
    read_file = getattr(ConfigParser, 'read_file', ConfigParser.readfp)
                                                   ^^^^^^^^^^^^^^^^^^^
AttributeError: type object 'ConfigParser' has no attribute 'readfp'. Did you mean: 'read'?
原来是python3.9之后就没有readfp了,而是read,这里的deploy包版本低导致的

手工升级PasteDeploy

pip install -U PasteDeploy
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: PasteDeploy in /home/skywalk/ub22py312/lib/python3.12/site-packages (2.1.1)
Collecting PasteDeployDownloading https://pypi.tuna.tsinghua.edu.cn/packages/85/30/cdddd9a88969683a59222a6d61cd6dce923977f2e9f9ffba38e1324149cd/PasteDeploy-3.1.0-py3-none-any.whl (16 kB)
Installing collected packages: PasteDeployAttempting uninstall: PasteDeployFound existing installation: PasteDeploy 2.1.1Uninstalling PasteDeploy-2.1.1:Successfully uninstalled PasteDeploy-2.1.1
Successfully installed PasteDeploy-3.1.0

问题解决

报错:No module named 'kotti_tinymce'

kotti_tinymce库解决,注意,由于该库很老,所以需要加上--use-pep517

pip install  --use-pep517 kotti_tinymce

报错:ModuleNotFoundError: No module named 'pyramid_debugtoolbar'

pip install pyramid_debugtoolbar

报错:AttributeError: 'Engine' object has no attribute 'table_names'

  File "/home/skywalk/ub22py312/lib/python3.12/site-packages/paste/deploy/loadwsgi.py", line 136, in invoke
    return fix_call(context.object, context.global_conf, **context.local_conf)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/skywalk/ub22py312/lib/python3.12/site-packages/paste/deploy/util.py", line 61, in fix_call
    val = callable(*args, **kw)
          ^^^^^^^^^^^^^^^^^^^^^
  File "/home/skywalk/work/autocoder/Kotti/kotti/__init__.py", line 198, in main
    initialize_sql(engine)
  File "/home/skywalk/work/autocoder/Kotti/kotti/resources.py", line 964, in initialize_sql
    if not engine.table_names():
           ^^^^^^^^^^^^^^^^^^
AttributeError: 'Engine' object has no attribute 'table_names'
解决方法:

原因
table_names() 这个方法,在 SQLAlchemy 1.4.x 及 2.0 之后正式被移除(参考官方文档)。你的 Kotti 项目代码还在用 engine.table_names(),这段是老的用法,只能在 SQLAlchemy 旧版本(1.3.x 及更早)下用。


解决方案

1. 现代 SQLAlchemy 的正确调用

用 inspect(engine).get_table_names() 代替原有的 engine.table_names()

修正方法举例:

from sqlalchemy import inspectdef initialize_sql(engine):inspector = inspect(engine)if not inspector.get_table_names():# ...
  • 这样无论 SQLAlchemy 1.4.x 还是 2.x.x 都没问题。

就按照提示的,修改resource.py文件,

    # if not engine.table_names():inspector = inspect(engine)if not inspector.get_table_names():stamp_heads()

pytest的时候报错:ModuleNotFoundError: No module named 'mock'

安装mock

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/84170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

luckysheet的使用——17.将表格作为pdf下载到本地

luckysheet源码里面自带有打印按钮&#xff0c;但是功能是无法使用的&#xff0c;所以我把该功能重写了一遍 1.在menuButton.js文件中找到源码打印按钮的触发事件&#xff1a; $("#luckysheet-icon-print").click(function () {}2.使用自己写的挂载方法 window.pr…

仿真APP助力提升卡车驾驶室驾乘舒适度与安全性

驾驶室作为卡车的重要组成部分&#xff0c;其振动特性对于驾驶员的舒适度和长期健康具有至关重要的影响。振动不仅会导致驾驶员疲劳、分散注意力&#xff0c;还可能引发一系列健康问题。为了确保卡车在复杂路面工况下驾驶室结构不受破坏&#xff0c;并保持良好的NVH性能&#x…

功能强大且易于使用的 JavaScript 音频库howler.js 和AI里如何同时文字跟音频构思想法

howler.js 是一个功能强大且易于使用的 JavaScript 音频库&#xff0c;它提供了跨浏览器的音频播放功能&#xff0c;支持多种音频格式&#xff0c;并且具有丰富的 API&#xff0c;可以方便地控制音频的播放、暂停、循环、音量等。下面是如何在 Vue 项目中使用 howler.js 实现音…

JUC入门(七)

14、ForkJoin ForkJoin框架是Java中用于并行执行任务的框架&#xff0c;特别适合处理可以分解为多个子任务的复杂计算。它基于“分而治之”的思想&#xff0c;将一个大任务分解为多个小任务&#xff0c;这些小任务可以并行执行&#xff0c;最后将结果合并。 ForkJoin框架的核…

第 7 章:综合回顾与性能优化

本章目标: 系统化地回顾各类外设接口选型原则 深入探讨多接口并存时的资源冲突与管理策略 掌握软硬件协同的性能分析方法,快速定位并消除瓶颈 总结一整套从架构设计到现场调试的最佳实践与防坑指南 7.1 综合选型决策矩阵(深度分析) 除了前文的基础矩阵,这里引入两个更细化…

交换机的连接方式堆叠和级联

以下是交换机的堆叠和级联各自的优缺点总结&#xff0c;帮助快速对比选择&#xff1a; ​一、堆叠&#xff08;Stacking&#xff09;​ ​优点 ​高性能 堆叠链路带宽高&#xff08;如10G/40G/100G&#xff09;&#xff0c;成员间数据通过背板直连&#xff0c;无带宽瓶颈。支…

C++高效求解非线性方程组的实践指南

非线性方程组的求解是科学与工程计算中的核心问题之一&#xff0c;涉及物理建模、机器学习、金融分析等多个领域。C因其高性能和底层控制能力成为此类问题的首选语言&#xff0c;但如何高效实现求解仍存在诸多挑战。本文从算法选择、工具应用、稳定性优化及性能提升四个维度&am…

2025年- H42-Lc150 --146. LRU缓存(哈希表,双链表)需二刷--Java版

1.题目描述 2.思路 LRU(最近最少使用&#xff09;&#xff1a;如果缓存的容量为2&#xff0c;刚开始的两个元素都入栈。之后该2元素中有其中一个元素&#xff08;重点元素&#xff09;被访问。把最近访问过的重点元素保留&#xff0c;另一个边缘元素就得离开缓存了。 下面是l…

5G 网络中 DNN 的深度解析:从基础概念到核心应用

摘要 本文深度剖析 5G 网络中 DNN(数据网络名称)的核心作用与运行机制,从基础概念入手,详细阐述 DNN 在会话管理、用户面资源分配、切片选择等方面的关键功能。通过实际应用场景分析与技术实现细节探讨,揭示 DNN 如何助力 5G 网络满足多样化业务需求,为 5G 网络部署、优…

MLpack 开源库介绍与使用指南

MLpack 开源库介绍与使用指南 1. MLpack 简介 MLpack 是一个快速、灵活的 C 机器学习库&#xff0c;专注于可扩展性、速度和易用性。它提供了大量经典的机器学习算法实现&#xff0c;包括&#xff1a; 监督学习&#xff08;分类、回归&#xff09;无监督学习&#xff08;聚类…

Python版scorecardpy库woebin函数使用

scorecardpy 是一款专门用于评分卡模型开发的 Python 库&#xff0c;由谢士晨博士开发&#xff0c;该软件包是R软件包评分卡的Python版本。量级较轻&#xff0c;依赖更少&#xff0c;旨在简化传统信用风险计分卡模型的开发过程&#xff0c;使这些模型的构建更加高效且易于操作。…

英语写作中“假设”suppose, assume, presume 的用法

一、suppose 是给出推理的前提&#xff0c;与事实无关&#xff0c;例如&#xff1a; Suppose x >0. Then the square root of x is a real number. &#xff08;假设x大于0&#xff0c;则x的平方根是实数。&#xff09; Suppose Jack and Alice share a private channel. …

CAD标注样式如何设置?详细教程来了

CAD中有很多的标注&#xff0c;比如线性标注&#xff0c;对齐标注&#xff0c;坐标标注&#xff0c;面积标注&#xff0c;直径标注&#xff0c;弧长标注等等&#xff0c;标注的种类多&#xff0c;标注的样式也多&#xff0c;今天来给大家介绍一下浩辰CAD看图王中如何设置不同的…

vscode include总是报错

VSCode 的 C/C 扩展可以通过配置 c_cpp_properties.json 来使用 compile_commands.json 文件中的编译信息&#xff0c;包括 include path、编译选项等。这样可以确保 VSCode 的 IntelliSense 与实际编译环境保持一致。 方法一&#xff1a;直接指定 compile_commands.json 路径…

自动化立体仓库WCS与PLC通讯设计规范

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。欢迎大家使用我们的仓储物流技术AI智能体。 新书《智能物流系统构成与技术实践》 新书《智能仓储项目出海-英语手册&#xff0c;必备&#xff01;》 完整版文件和更多学习资料&#xf…

【window QT开发】简易的对称密钥加解密工具(包含图形应用工具和命令行工具)

前言 项目开发时&#xff0c;配置文件中某些信息不适合直接明文显示&#xff0c;本文提供基于对称密钥的AES-256算法的加解密工具&#xff0c;可集成到项目中。 AES讲解 以下是我分享的一个在国产信创系统(Linux)下使用openssl实现AES加解密的博文 对称加密--AES加解密 本文…

「极简」扣子(coze)教程 | 小程序UI设计进阶(二)!让系统动起来,“禁用”,“加载”状态设置

大家好&#xff0c;上一期大师兄通过一个例子来介绍一下扣子界面中“可见性”的应用。今天大师兄想再进一步介绍控件中的其他一些重要的属性。 扣子&#xff08;coze&#xff09;编程 「极简」扣子(coze)教程 | 小程序UI设计进阶&#xff01;控件可见性设置 「极简」扣子(coze…

前端三件套之html详解

目录 一 认识 二 标签的分类 三 标签 body标签 标题标签 段落标签 换行标签 水平分割线 文本格式化标签 图片标签 音频标签 链接标签 列表标签 表格标签 表单标签 input标签 下拉菜单标签 textarea文本域标签 label标签 语义化标签 button标签 字符实体 …

Google Play 账号创建及材料准备

1&#xff1a;注册一个关联Google Play账号的Google账号&#xff0c;关联邮箱进行自动转发 2&#xff1a;准备一张Visa、Master、JCB、运通卡或Discover等美国信用卡或全球付虚拟信用卡&#xff0c;用来支付25美金的GP账号注册费 3&#xff1a;为避免出现关联原因被封&#x…

Pycharm和Flask的学习心得(4和5)

一&#xff1a;认识路由&#xff1a; &#xff08;1&#xff09;&#xff1a;接受请求的类型&#xff1a; app.route(hello ,methods [GET ,POST]) 请求类型主要有两种(常用)&#xff1a;GET 和 POST ; GET: 直接输入的网址&#xff08;url访问的就是GET请求&#xff09; …