• [技术干货] 了解项目的需求分析及拆解、手动测试开发最小可行产品
    一、项目需求分析及拆解项目案例在写代码之前做需求分析,明白写什么,清晰的判断出来写的对不对,不然就白忙活了。首先需要梳理需求,根据第一篇文章写的。主要需求:当pytest执行结束之后,自动将结果发送到钉钉、微信、飞鼠、email等。不能指着一句话写代码,首先要对需求进行梳理,需要不断的抛出问题,结果包含什么?比如:希望pytest的结果包含什么呢?结合实际业务需求:测试开始时间(必有)测试结束时间测试执行时长测试用例总数量测试用例成功的数量测试用例失败的数量测试用例通过率测试报告地址等等 结合团队、环境根据实际开发。发送到“哪里”?根据实际情况发送到微信、钉钉、也可以扩展的比如说发展到推特、微博之类的。思考需求内容,是不同的场景,比如说:给钉钉发送消息呢?首先需要注册个钉钉号-钉钉号加自己号好友-通过消息对话框发送消息。另外方案:可以通过钉钉的群来发送,适用于发送给多人。 实现具体化。微信也是如此:个人、群、公众号。来了解发送到什么地方?怎么去发送?需要加好友、在手机或电脑发送好友消息。群的话不需要加好友用群的机器人发消息、通过接口发送消息。公众号也许要调用接口,前提是必须关注公众号才会发送内容。EMAIL通过SMTP服务器发送右键即可。什么时候发送?每次测试结束还是有用例失败?写代码之前分析需求,找产品经理确认需求再去做。比如说选择刚开始的:测试开始时间、测试执行时长、测试用例总数量、测试用例成功的数量、测试用例失败的数量、测试用例通过率。发送到群当中,使用机器人方式发送,选择而每次测试结束后发。二、编码思路编写伪代码,将需求思路捋一遍,保证代码正确。Pytest在运行时会调用很多hook,那我们需要哪些呢?根据分析来确定hook。比如:测试开始时自动执行,记录开始时间。测试结束时自动执行,记录结束时间,计算执行时长,发送结果。怎么去知道有多少个测试用例呢?需要hook,再收集完测试用例之后自动执行,记录总的用例数量。每一个用例执行结束之后自动执行,记录当前用例的结果。发送到什么地方需要用API,如果说发送到微信,只能用企业微信了,如果说发送到钉钉、飞书是提供相关接口的。以微信为例,在群当中添加机器人的名字后会出现接口和接口的说明。如图:​补充:通过EMAIL的SMTP协议来发送,所以我们需要SMTP的服务器、账号、链接代码实现。先写测试用例在写代码,比如说记录时间,怎么确定是记录到了呢?需要测试用hook确实得到了相关结果,保证产品交互。但是不可能写完所有代码后再去测试,这就缺少了全局观,不知道代码细节所以更偏向黑盒测试,但测试开发更偏向于白盒测试,所以用例需要在写代码之前或交互之前完成,先设计测试用例,分为俩个测试:单元测试:测试开始时间、执行时长,是否准确。用例执行结果,是否准确。用例数量,是否准确。用例通过率,是否准确。API或SMTP,是否可用。集成测试(满足整体需求):测试结束时,在微信群中,收到结果通知。通过单元测试判断做的某一些事情是否准确,通过集成测试来判断单元测试是否都完成并准确后才用到的,验证整个项目是否满足需求。三、编码从单元测试角度分析来编码,在之前plugin.py中已经完成了第一步,为了能够测试它需要写一个测试用例,如图:​设置代码的相应时长为2.5s,所以再2.5之后会完用例执行。在plugin中编写date时间,自动为它生成一个执行耗时,放到执行之后,打印出来时间。如图:  ​    ​单元测试,通过断言来判断花费时间,是否正确。如图:    ​运行pytest即可查看,是否正确,如果错了就会报错。验证了起始时间、结束时间、用例执行时间是准确的。用例执行结果,如果只有一个用例可能会报错,可以多写几个用例,正常来说是三个用例,俩个通过一个失败。如图:            ​检查用例数量是否正确,通过断言,assert来判断,数量是否等于3.,在收集完之后在判断,首先需要导入putest,进入之后找到所有hook,可以通过左下角的类和变量来快速找到参数,收集相关的并翻译,插件其实也可以对项目进行筛选和排序。在所有用例完成之后调用钩子,来证明所有用例收集之后结束。写钩子中的session是空函数,名字、参数、结果,参数是session包含了很多信息用例之类的,收集到的用例在什么地方呢?用例在完成之后执行,包含了全部的用例。如图:​​​如果涉及到了长周期的项目,怎么知道完成的定位?用例就是代表了要做的事情,数量就代表了工作的进度,用例的执行结果?通过断言来判断。如图:​执行的过程都会报错,不会让你把工作疏忽掉,其实也就间接的定位了工作进程,有用例就可以提醒什么地方没有做到位。这叫做测试驱动开发、开发进度、质量,下一步重点都是测试用例来把握。每一个用例执行结束之后自动执行,记录当前结果。在钩子中,名字、参数、返回值比较重要,没有返回值就看其余的。当有很多钩子选择时选择参数才是对的,logreport就是结果,找到runtest开头,report的,对钩子可以先翻译,有个基本的了解。如图:         ​三个用例为什么这么多结果,其实是每个用例分了三个部分,setup、调用、teardown阶段、其实在call就是调用阶段就可以知道是通过还是失败。加一个判断,如图:         ​做一个数据的记录,记录多少个失败多少个成功,修改断言处的pass为passed,fail为failed,并统计一下一共有多少个数量,在date当中设一个初始值,当某一个用例出现结果之后呢就会修改当中的相关的用例类型的数量         ​就是说本次用例如果通过就让结果统计的数据+1。,没有前面的报错说明结果是ok的,单元测试到此就已经测试通过了。测试通过率就不好写断言了,通过date来计算值。计算百分比也可以通过GPT来算如图:         ​         ​ 修改2f后加入%,上述代码66.66改为66.67.​单元测试中的接口API地址,在测试中设置url请求地址,查看后是发送json的请求,所以首先导入requests,并在pdm后安装requests不需要加-d。可以在项目的配置文件中查到requests的版本号是多少,确定了确实存在这个东西。这样在安装时候才能自动下载安装。如图:​​根据手册中的内容是发送post请求,比如说requests.post中,用普通文本的类型来实现,可以先测试下hello,world如图:​结果就是群里面发送了相关信息,证明了API是可用的。机器人说明当中还可以艾特某人、markdown格式。里面可能带字体颜色、语法。如图:        ​也可以自己建一个mkdown,md文件来写内容,比如说pytest自动化测试结果,需要测试时间、用例数量、执行时长、测试通过、测试失败、测试通过率、测试报告地址:http://baidu.com 如图:​               也可以通过加一个标签或mkdown的形式来体现测试失败的样子。颜色自己改如图:​           将写好的代码放到.py测试文件中,并将content内容放到下方的content。如图:​​        集成测试。我们执行pytest,客户可以直接收到结果,集成不太方便自动化,将接口请求代码和它进行集成。将.py的代码复制到plugin中去,并把import放到data上面去,将测试时间放到下方的测试时间中去,加一个f用一个花括号来替代并把所需要发送的内容依次替代即可。注意百分号如果加在双引号里面则后续不用修改,如果百分号加在外面,后面的也需要加百分号并加在外面。如图:​​​      补充:在这里可以去掉换行,否在影响发送效果,执行时间可以进一步的优化。可以删掉s,优化毫秒。如图:​先pdm check 优化代码、检查代码质量赶快commit提交!!!备注随便写,可以获取必要数据并发送到企业微信中去。如果需要严格的验证可以pdm build打包出来,下方会出现安装包,使用全新的环境来安装安装包,来模拟全新的使用和环境的电脑。如图:​报错问题是因为版本号:可以pip install 后再卸载​​​这次运行就可以啦~完美 撒花 结束!
  • [技术干货] 手把手教你如何使用git来建立代码仓库、三大工具的使用方法?
    一、创建一个新的插件:项目为单位的管理模式直接新建项目步骤:1:创建新的项目2:创建虚拟环境 venv3:安装pdm 自行安装4:使用我们的pdm来初始化项目  新建项目指定项目的位置,然后我们创建pytest插件约定一定要pytest-开头,创建一个结果通知插件 自动将整个pytest测试结果通过钉钉、飞书方式发送出去名字建立:  输入pdm init 输入y安装插件 后默认即可回车就可以了。如图:  手动创建目录src存放项目源码和tests存放测试用例,写的插件、项目都要有对应的单元测试用例,创建pythonpackage包 再python当中你的包名不可以出现+-号,名为pytest_result_sender。Pyproject.toml是项目源码,项目源码当中介绍 插件名字文本号或作者以及依赖还可以添加插件的入口点并指定源码再src中如图:项目创建就ok了。2:编写代码:举个简单例子,新建python文件创建插件文件再plugin.py中写hook,比如首先在,From datetime import datetime是生成当前实践Def pytest_configure():#会在配置加载完毕之后执行,也就是再测试用例前面执行Print(f”{datetime.now()}”pytest开始执行)Def pytest_unconfigure():Print(f”{datetime.now()}”pytest结束执行)再所由用例之前执行这个代码如图实现最终效果:二、测开平台之企业级项目开发实战篇1.建立git仓库跟踪代码更新进行版本控制2.使用black+iosrt的进行代码质量控制3.项目需求分析梳理及拆解设计测试用例4.测试驱动开发完成mvp最小化可行产品1.使用git进行代码版本的控制使用git不仅仅是把他存起来,托管,也是通过git方式来跟踪代码变化,防止代码写错或bug、删掉代码如何找回呢?都是通过该控制工具实现。使用方法:1:初始化仓库Git init项目目录在什么地方就在这个地方执行命令即可。仓库不是源码的一部分而是将源码放到仓库中,从代码变化到仓库变化。会将仓库内容保存到git中,使用俩种方式实现内容分割,.git代表隐藏、也可以通过右键查看是否为隐藏文件。如果仓库已经创建再去执行也可以,如图所示:2.将代码放到仓库当中安装git时可以右键git gui 通过使用git自带的界面。如图所示。来对内容进行控制,初始化项目之后也可以在上面的菜单栏当中点击git的按钮里面也有很多东西来修改。删除.git文件后会发现无法使用git命令。如图所示:1)Git gui页面介绍画红色圈圈地方是没有保存到仓库文件,但是已经提交了。下方的四个按钮第一个是扫描,第二个是存储,第三个是签名,第四个是提交,第五个是push。推到远程仓库当中。可以每个按钮按一遍就知道怎么操作了,可以通过提交历史来查看第一次代码的提交。注意:忽略配置是不关心不重要不希望加到代码仓库中比如说:pycharm编译器里面东西,预编译文件等。让我们的git忽略掉它,对它视而不见有俩种方法:第一种就是将需要的文件选中到代码仓库,但是有点笨,而且不好拿捏哪个是忽略的配置第二种是配置文件在pycharm中在pycharm根目录中创建一个git忽略文件,如图所示。里面对编译文件、扩展文件、虚拟环境,写到这个文件中的内容是不要的,写完后在ui界面重新扫描下会发现文件就少了很多,如图所示。只剩下了gt的忽略文件,项目配置文件、源码等等。忽略了:ide、python的预编译文件就是pyc解位的文件、各种临时文件、包括还有我们的打包编译文件等等。这些都可以直接拿来用就不用自己写了。如何查看自己删除掉的代码呢?可以将上方写的plugin.py下方的代码库删掉后点击下方的log日志查看。如图所示。就可以看到上面的文件下写着在plugin.py下删除了右侧的代码。然后再ui界面来备注下:清空掉了代码内容 点击commit提交这地方就是清空掉了,这时候便是入库存储起来了,后续文件的修改需求也可以这么做,如果有一天后悔了这么改可以回滚回来吗?是可以的,不需要备份!怎么找回之前删除的代码呢?比如说要找plugn的文件可以选中文件后再编辑页右键选中git再选中show diff 显示版本之间的差异,下方可以选中历史,比如说再三分钟或俩分钟之前是什么样的,可以回滚操作,选中要回滚的时间,右键选中showdiff,修改上方的行参数来回退到之前版本,或再git中选中resethead如图所示。将版本号再右下方带有数字放到head中,选择head方式来reser重置,代码就回来了。             2)回退版本   Reset –head 再不同版本之间随便跳跃比如将来代码中出现bug,不知道怎么修改可以回退到上一个没有bug的版本,保证系统正常,主要是来记录代码和遇到突发状况可     以实现版本回退,多个版本之间可以比较版本之间的差异。用git来实现代码的控制,为了确保代码有备份能控制可回退:一定要及时的commit!如果没有commit代码而     是直接reset代码就会丢失。   注意:一定要及时commit!!!2.使用black+iosrt代码的质量控制和之前的代码版本控制,改了什么怎么样改回来,这里更注重代码不能随便的写,由于每个人可以写出不同的风格所以要求质量控制,通过使用三件套black、isort、flake8来进行代码的质量控制,保证每个人的代码质量、风格等接近。Pdm是全项目的管理不仅仅用到安装使用工具时首先安装依赖Pdm add 要安装的东西即可 和pytest同理 但是不能这样去做,我们安装了以来但是使用这些的人需要安装这样工具吗?不需要。我们写插件要用到这种东西但是不能强加给使用框架或插件的人,应该怎么办?在开发依赖后加-dPdm add black iosrt flake8 -dPdm add pytest 叫运行依赖什么叫运行依赖?运行这个软件或系统就要安装pytest,开发依赖顾名思义就是在开发中需要而不是在终端用户中用到,所以不会安装。安装如图:    三种工具之间的角色:Black::不妥协的代码格式化,让每一个开发的代码形成统一的风格标准。在下方输入 black 文件名字回车就会发现代码被格式化了,如图所示。    Iosrt:对import语句进行排序 用法同理 black。导入的规则:          导入系统内置模块、第三方模块随后是自己写的模块。Flake8:代码质量分析      主要是检测代码中潜在的bug,怎么解决bug,分析什么变量、导入什么模块、在什么地方使用模块、使用的方式对不对合不合理进行分析。用法同理black。上面三个工具对代码进行修改和质量检查避免有很多坑,对多个文件怎么使用工具呢?配置脚手架让它自动执行,在project.toml中去写,代码如下:    创建check会自动调用这三个工具,并创建flake文件让它在检查时可以将不必要文件进行排除。    这时候在命令行中敲入:pdm check 就会自动的检查所有的文件,如图所示。    提示的地方可能是代码的错误问题,需要自行修改在修改完后再次执行会发现没有任何错误提示,就是搞定了。代码项目配置好后可以保存项目修改,点击git后点击commit。在文件下方也可以输入备注信息来区分,可以通过下方git查看保存信息。
  • [技术干货] 了解pytest插件机制、定制思路及hook常用插件清单
    一、了解hook清单方式、查看、翻译的方式有哪些: 接着上回说的pytest的hook清单是什么?怎么去查看hook清单呢?如何使用hook清单呢?下面小编就为大家来解析下。  hook清单又叫钩子函数,在pytest_的函数当中都是空的,是为了提供了名字、参数、返回值来为插件使用,其实也是hook支持的插件机制,查看hook清单的方法有俩种:    方法一:查看源码  在hookspec.py中可以查看到所有的约定。如图:               方法二:查看pytest官方文档:https://docs.pytest.org/en/7.3.x/reference/referece.html#hooks                    文档从介绍pytest-收集测试用例-执行测试用例-断言-报告-调试阶段,来具体分析。二、查找到的hook清单源码如何翻译及获取?  源码翻译和上述介绍的方法是对应的,第一种方法介绍的是再软件上查看hook清单可以选择钩子后右键add....输入“翻译下方内容”即可。第二种方法是浏览文档后在文档中进行翻译,右键选中进行翻译即可,直接看到中文内容扫清了学习障碍。看到的hook都是pytest本身,在安装第三方插件后,如果插件提供新的hook内部是无法看到的 需要通过源码的方式去动态获取,看到的hook清单都是pytest 插件的hook并没有体现需要动态获取。三、如何使用hook有哪些规则?     1: 被动的调用:          比如说在项目中创建conftest.py文件实现hook函数编写,编写测试用例,定义函数并没有执行函数所以print无法打印输出结果是空。可以直接使用pytest会发现函数被调用,是由pytest在执行过程中调用函数才能输出,这就是被动的调用不需要做什么,只需要知道hook名字创建同名函数等待被调用即可。          代码如下图所示:                   2:掌握主动         很多插件可以改变pytest原有的运行过程和运行结果,所以是掌握主动,完全改变运行的流程顺序和结果,比如创建hook后不想按照原有方式执行可以在前面加一个装饰器,@pytest为什么加装饰器呢?实际上按照我们插件的机制规则和系统规则每一个hook都要加一个装饰器,如果用简单的用法可以不加装饰器,高级用法加装饰器,在装饰器中加上参数trelast=true 。如图所示:                  如果去掉装饰器就会被调用,说明作为一个钩子来讲能不能被调用自己可以说的算,除了自己可以不被调用之外,还可以修改tryfrist后加一个return “泽宇李真帅”发现框架不被执行。如图所示:                 Pytest要不要执行怎么执行执行结果是什么由我自己代码说的算,就是说做什么返回什么,可以说对一些结果的串改,结果的串改是比较粗放的,修改效果也是一点不够高雅或细致,可以做一些酷炫效果,比如:        新建一个测试用例 test_api,Def  test_apiO: Assert 1==0断言,输入pytest后再文件中找到并执行测试用例,结果是断言失败是因为1不等于0?测试开发的能力是可以深度的控制和改变我们框架的执行过程,上方的用例如何从测试失败变成测试通过再不改变代码的情况下,通过hook方式进行修改,修改是非常的细致化,相对比被动调用是简单的,       3:完全控制的方式及步骤:     首先创建个函数  如图:         1:添加装饰器 @pytest.hookmpl(hookwrapper=true)以一个包装器的方式来运行         2:def 函数: print(“用例开始执行”)——前置         3:yield关键字  outcome=yield 因为是生成器 将结果保存再outcome         4:print(‘用例执行结束’)——后置 用例执行之后         5:修改俄式用例 print(“修改测试用例为测试结果为:通过”)         6:outcome.force_result(1)即可将失败换位passed     结果就是,断言1==0 改成了测试通过,根本不关心1还是0 ,根本就是我们改变了框架运行逻辑。四、断言失败和成果的标准:  测试通过的1或0都可以 为什么写任何数字都可以,0和1都代码通过呢?什么代表失败呢?从通过改失败是怎么改的呢?标准是怎么定呢?Pytest中,什么是测试通过的标准,什么是测试失败的标准?怎么判定呢?   测试失败的标准有三种:      断言异常就会判定为测试失败      Setup异常:判断测试出错      没有异常:判断测试通过  如何把测试通过的用例修改为测试失败呢?比如说,Assert 1==1 断言测试,如果没有钩子(函数)的话测试是通过的,用钩子来修改为失败这里需要添加断言。比如 assert_false 引发断言异常 被判定为失败,这就是框架里面东西  使用框架的都要掌握 测开和自动化测试都需要掌握。
  • [技术干货] 什么是pytest,手把手教你搞定pytest的上线与发布
    一:介绍pytest岗位及区别  伴随着人工智能的兴起,自动化测试和测试开发都需要掌握pytest框架,说到这肯定有同学好奇,都是要掌握pytest架构为什么还分为俩个岗位呢?这里我们就聊聊二者的本质区别:  1:使用pytest   测试用例的编写人员        测试框架的维护人员 配置 消除错误提示         扮演使用者的角色 根据需求编写用例代码2:维护pytest        Pytset核心开发人员  Pytest插件开发人员        更多关心pytest内部原理 怎么样添加功能或修改bug  扮演开发角色二:了解pytest架构及查看方法、特点  综上所述可以看到二者的本质区别,那pytest都可以满足我们的什么需求呢?小编在这里列举了一些比如:失败重新、并发执行、用例排序、生成报告、统计覆盖率、发送邮件等等都是通过pytest中插件实现 ,所以说为什么要很好的掌握pytest架构呢?其实就是要挑战年薪百万,Pytest不仅仅是框架,pytest本身是多个插件组合而成,从pytest源码来学习测试开发来了解其功能。  查看源码方法:         在pycharm中导入:import pytest              输入:pytest.main()函数 同时按下F4来查看pytest源码。          可以看到左边的目录下有大量的文件,大部分文件都有函数且以 pytest_开头 所以说是 由pytest插件来构成。   pytest特点:            1:包含大量插件。            2:pytest中的main函数为入口点,来执行pytest下的main函数 真正执行的是 config。。。和判断try...expert。            3:加载配置            4:执行hook            5:返回exitcode让函数结束执行   注意:main入口点就是调用插件所以说pytest本身就是个插件。            可以理解为pytest框架就是由N个插件堆积起来的,所以相对pytest更深入的了解和开发就需要掌握pytest架构。三:掌握pytest搭建测试平台思路   如何搭建一个测试平台呢?            1:用django在线编辑excel、yaml文件            2:pytest读取和执行excel、yaml文件,生成我们的调试报告、日志记录。            3:用pytest加载yaml文件 生成了 日志和报告                       查看接口请求日志 生成alure的报告 报告可以选用网页报告 放到django中             4:用django来在线展示测试结果和测试报告注意:allure由ajango提供支持http协议才可以查看报告信息。             综上所述,pytest是一个插件系统,因为具备插件系统的pluggy可以使插件之间相互配合。pluggy基本原理:       pytest的源码当中可以看到pytest_这些东西很重要就是插件一个约定       1:声明一个函数,称之为hook 不会执行 只用作声明。       2:软件运行的过程中 会自动的调用hook。       3:插件会按照hook的方式 实现函数,被软件自动的调用。       插件成为了软件的一部分所以可以自动的调用,插件的特点可以加入也可以退出可以把hook理解成约定 插件是按照约定想来就来想走就走  软件是陪着插件和hook到最后 运行环境 插件系统,查看系统的前提条件是一定要有约定  有约定按照约定进行即可 约定就是hook。总结:       1:深入掌握pytest的必经之路       2:测试开发的标志       3:解决项目需求的技术储备       4:搭建测试平台必备的基础综上几步可以来搭建测试平台是非常容易的,但是在pytest执行过程中用到很多插件比如:anyio处理异步、xdist读取excel文件、allure生成报告、多个插件和pytest本身配合来实现。通过插件的方式来扩展功能。
  • [技术干货] 详解Django中CSRF和CORS的区别【转】
    一、CSRF:保护机制Django预防CSRF攻击的方法是在用户提交的表单中加入一个csrftoken的隐含值,这个值和服务器中保存的csrftoken的值相同,这样做的原理如下:1、在用户访问django的可信站点时,django反馈给用户的表单中有一个隐含字段csrftoken,这个值是在服务器端随机生成的,每一次提交表单都会生成不同的值2、当用户提交django的表单时,服务器校验这个表单的csrftoken是否和自己保存的一致,来判断用户的合法性3、当用户被csrf攻击从其他站点发送精心编制的攻击请求时,由于其他站点不可能知道隐藏的csrftoken字段的信息这样在服务器端就会校验失败,攻击被成功防御二、CORS:跨域访问举例:前端和后端分别是两个不同的端⼝前端:127.0.0.1:8081后端:192.168.17.129:8880现在,前端与后端分别是不同的端⼝,这就涉及到跨域访问数据的问题,因为浏览器的同源策略,默认是不⽀持两个不同域名间相互访问数据,⽽我们需要在两个域名间相互传递数据,这时我们就要为后端添加跨域访问的⽀持。django后端设置:1、使用django-cors-headers扩展 a、安装1pip install django-cors-headersb、添加子应用12345INSTALLED_APPS = [     ...     'corsheaders',     ...]c、中间件配置1234MIDDLEWARE = [     'corsheaders.middleware.CorsMiddleware',     ... ]d、添加白名单12345678910# 设置CORS⽩名单CORS_ORIGIN_WHITELIST = (     'http://127.0.0.1:8081',    'http://127.0.0.1:8080',     'http://localhost:8080',     'http://www.nagle.cn:8080',     'http://api.nagle.cn:8083',) CORS_ALLOW_CREDENTIALS = True # 允许携带cookie凡是出现在⽩名单中的域名,都可以访问后端接⼝CORS_ALLOW_CREDENTIALS 指明在跨域访问中,后端是否⽀持对cookie的操作。2、跨域实现流程 a、浏览器会第一次先发送OPTIONS请求询问后端是否允许跨域,后端查询白名单中是否有这个域名 b、如果域名在白名单列表中则响应结果中告知浏览器允许跨域 c、浏览器第二次发送POST请求,携带用户登录数据到后端,完成登录验证操作
  • [技术干货] Python包管理工具pip用法详解(转载)
    pip提供我们各色各样的软件(第三方库),而这些第三方库又可以给我们实现各种各样不同的功能,科学计算、画图、操作文件、聊天……我们可以通过Cmd终端、Pycharm、Jupyter三种平台使用pip安装这些第三方库。官方Python 第三方库软件包地址:PyPI · Python 包索引Anaconda,Conda,Pip的关系Anaconda是一个python发行版。软件发行版是在系统上提前编译和配置好的软件包集合, 装好了后就可以直接用。Conda是一个包管理器。包管理器是自动化软件安装,更新,卸载的一种工具。Conda,有命令”conda install”, “conda update”, “conda remove”, 所以很明显, conda是包管理器。Conda和Anaconda名字相似,但没有必然关系, 你可以不安装Anaconda的同时, 使用Conda安装和管理软件。Conda是一个通用的包管理器,当初设计来管理任何语言的包。所以用来管理python包当然也是绰绰有余。Conda 和 pip 目标并不相同, 只有小部分子集有交集有竞争关系:比如python包的安装和环境隔离。pip可以允许你在任何环境中安装python包,而conda允许你在conda环境中安装任何语言包(包括c语言或者python)。一、Pip介绍pip是Python包管理工具,可以通过命令行的方式安装、卸载、更新三方库,先来看看具体有哪些指令:1、常用指令pip help / pip -h:查看pip的所有指令信息pip install 库名:安装第三发库pip install django==1.10.0:后面可以用==号指定包的版本pip --default-timeout=100 install -U django==1.10.0:万能安装第三方库,增加延迟,添加管理员权限安装pip install –-upgrade/ -U 库名:更新第三方库pip uninstall 库名:卸载第三方库pip list / pip freeze:列举当前项目路径安装的所有的包pip show:查看已经安装的包的信息,如pip show django查看django的具体信息,pip show --files django查看django的所有文件pip freeze > requirements.txt:将项目目录下安装的所有包信息输出到requirements.txt文件中。pip freeze -r requirements.txt:读取requirements.txt文件中的包信息,安装所有包。这样先将项目的三方包版本信息保存在requirements.txt文件中,切换到不同的环境,还可以安装该文件的所有三方包。2、pip更新:pip可以自己更新自己pip install -U pip3、基本使用(以django包为例)1、安装django软件pip install django #最新版本2、安装具体版本软件pip install django==1.11.8 # 指定版本pip install 'django>=1.11.0' # 大于某个版本3、查看具体安装文件pip show --files django4、列出软件包清单pip list5、查看哪些软件需要更新pip list --outdated6、升级软件包pip install --upgrade django7、卸载软件包pip uninstall django8、Requirements文件安装依赖软件Requirements文件 一般记录的是依赖软件列表,通过pip可以一次性安装依赖软件包:pip freeze > requirements.txtpip install -r requirements.txt9、查看软件包信息pip show django10、搜索pip search django
  • [问题求助] 【openGauss】请问Django可以用openGauss数据库吗?
    请问Django可以用openGauss数据库吗?有无参考文章
  • [新手课堂] Django后端处理post请求的request.body中数据
    最近在写后端处理代码的时候,有时候会出现post请求获取不到数据的情况,仔细观察一下。可能和views的函数书写风格不同有关。这里记录一下两种不同风格的后端获取数据的代码。FBV基于函数的视图我们需要将request.body从json对象转换为字典。@csrf_exemptdef getMeaning(request):    if request.method == "POST":        json_str = request.body         json_dict = json.loads(json_str)         key = json_dict.get("key", None) CBV基于类的视图我们直接从request.data获取数据即可。class AchievementViewSet(ModelViewSet):    # 添加竞赛    @action(methods=['post'], detail=False)    @csrf_exempt    def add_competition(self, request, *args, **kwargs):        name = request.data.get('name', None)
  • [新手课堂] Django中实战使用——常用的过滤器:
    Django中实战使用——常用的过滤器:①项目目录下的views.py文件:from django.shortcuts import renderfrom django.http import HttpResponse# Create your views here.from datetime import datetimedef index(request):    test="THIS IS A LIST!"    list=["A","B","C","D","E"]    data={        'test':test,        'xx':'',        'num1':1,        'num2':2,        'list':list,        'now':datetime.now(),        'html':'<h1>hello django!!!</h1>',        'float':3.1415926    }    return render(request, "index.html", data)②项目目录下templates模板文件夹下的模板文件index.html:<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>测试!</title></head><body>{#没做处理的变量:#}{{ test }}<br>{#设置了默认值的变量  在这个值被django认为是False的时候会使用此默认值。比如:空字符串,None。#}{{ xx|default:'xxxxx' }}<br>{#设置了只有为None时才使用默认值的变量#}{{ xx|default_if_none:'aaaaa'}}<br>{#变为小写后的变量#}{{ test|lower }}<br>{#先变为小写再将首字母大写后的变量#}{{ test|lower|capfirst }}<br>{#两个数字变量相加   add:字符串相加,数字相加,列表相加,如果失败,将会返回一个空字符串#}{{ num1|add:num2 }}<br>{#两个字符串变量相加#}{{ test|add:xx }}<br>{#列表变量的第一个元素#}{{ list|first }}<br>{#列表变量的最后一个元素#}{{ list|last }}<br>{#默认的data日期时间格式#}{{ now|date }}<br>{#默认的time时间格式#}{{ now|time }}<br>{#这是data过滤器的年月日24小时制时间格式#}{{ now|date:'Y/m/d/H:i:s' }}<br>{#这是time过滤器的时分秒12小时制时间格式#}{{ now|time:'h:i:s' }}<br>{#这是字符串的join方法  跟python中join一样的用法#}{{ list|join:'oooo' }}<br>{#这是字符串的长度方法#}{{ test|length }}<br>{#这是列表的长度是否为4#}{{ list|length_is:4 }}<br>{#下面这俩有xxx.html类型的,针对html,截断标签中的字符,而不会截断标签#}{#这是字符串只显示4个字符,其余省略(但是占3位)#}{{ test|truncatechars:7 }}<br>{#这是字符串只显示2个单词,其余省略(不占位)#}{{ test|truncatewords:2 }}<br>{#这是字符串的切片#}{{ test|slice:'1:4' }}<br>{#这是列表的切片#}{{ list|slice:'2' }}<br>{#这是含html标签的字符串#}{{ html }}<br>{#这是去掉字符串中的html标签#}{{ html|striptags }}<br>{#这是关掉自动转义,使字符串中html标签生效#}{{ html|safe }}<br>{#这是没做处理的小数#}{{ float }}<br>{#这是保留了一位小数#}{{ float|floatformat }}<br>{#这是保留了两位小数#}{{ float|floatformat:'2' }}</body></html>
  • [新手课堂] Django中常用过滤器
    语法:{{ fruits|lower }} 管道符号进行链式调用(可以理解为嵌套使用!),比如实现一个功能,先把所有字符变成小写,再把第一个字符转换成大写。语法:{{fruits|lower|capfirst}} 使用参数:过滤器可以使用参数,在过滤器名称后面使用冒号,加上双引号,双引号里面再加上参数,比如要把一个字符串中所有的空格去掉,则可以使用cut过滤器,语法: {{fruits|cut:" "}}注意:使用参数的时候,冒号和参数之间不能有任何空格,一定要紧挨着!
  • [开发环境] Django 加载 from modelarts.estimator import Estimator出现问题
    【功能模块】from modelarts.estimator import Estimatorfrom modelarts.session import Session【操作步骤&问题现象】1、加载以上两个模块,可访问我的Django服务,但是访问服务会报错 AttributeError: 'URLResolver' object has no attribute 'name'2、只要加载这两个库就会报DEBUG:django.utils.autoreload:File C:\Users\admin\PycharmProjects\untitled66\Newsletter\Newsletter\wsgi.py first seen with mtime 1617677856.389,原因是什莫呢?【截图信息】ime 1623202635.2614582DEBUG:django.utils.autoreload:File C:\Users\admin\PycharmProjects\untitled66\Newsletter\Newsletter\wsgi.py first seen with mtime 1617677856.389DEBUG:django.utils.autoreload:File C:\Users\admin\Desktop\untitled66\Lib\site-packages\django\contrib\sessions\migrations\__init__.py first seen with mtime 1619771268.1028512DEBUG:django.utils.autoreload:File C:\Users\admin\PycharmProjects\untitled66\Newsletter\Calibration\migrations\0002_alter_samplinginformation_result_status.py first seen with mtime 1623070533.263458DEBUG:django.utils.autoreload:File C:\Users\admin\Desktop\untitled66\Lib\site-packages\django\contrib\auth\migrations\0005_alter_user_last_login_null.py first seen with mtime 1619771267.322151DEBUG:django.utils.autoreload:File C:\Users\admin\Desktop\untitled66\Lib\site-packages\django\contrib\auth\migrations\0011_update_proxy_permissions.py first seen with mtime 1619771267.322151DEBUG:django.utils.autoreload:File C:\Users\admin\Desktop\untitled66\Lib\site-packages\django\contrib\auth\migrations\0012_alter_user_first_name_max_length.py first seen with mtime 1619771267.322151DEBUG:django.utils.autoreload:File C:\Users\admin\PycharmProjects\untitled66\Newsletter\NewsPigeon\migrations\0010_alter_workorderinformation_sampling_results.py first seen with mtime 1623341652.007612DEBUG:django.utils.autoreload:File C:\Users\admin\Desktop\untitled66\Lib\site-packages\django\contrib\auth\migrations\0009_alter_user_last_name_max_length.py first seen with mtime 1619771267.322151DEBUG:django.utils.autoreload:File C:\Users\admin\PycharmProjects\untitled66\Newsletter\NewsPigeon\migrations\__init__.py first seen with mtime 1620352078.5856836【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] 正确的理解和使用Django信号(Signals)
    Django 提供一个了“信号分发器”机制,允许解耦的应用在框架的其它地方发生操作时会被通知到。 通俗而讲Django信号的工作原理就是当某个事件发生的时候会发出一个信号(signals), 而监听这个信号的函数(receivers)就会立即执行。Django信号的应用场景很多,尤其是用于不同模型或程序间的联动。常见例子包括创建User对象实例时创建一对一关系的UserProfile对象实例,或者每当用户下订单时触发给管理员发邮件的动作。今天小编我就分享下如何正确使用Django的信号(signals)。 Django信号的一个简单例子假设我们有一个如下User模型,我们希望每次有User对象新创建时都打印出有新用户注册的提示信息,我们可以使用Django信号(signals)轻松实现。我们的信号发送者sender是User模型,每当User模型执行post_save动作时就会发出信号。此时我们自定义的create_user函数一旦监听到User发出的post_save信号就会执行,先通过if created判断对象是新创建的还是被更新的;如果对象是新创建的,就会打印出提示信息。# models.py12345678910111213141516from django.db import models from django.db.models import signalsfrom django.dispatch import receiver class User(models.Model):    name = models.CharField(max_length=16)    gender = models.CharField(max_length=32, blank=True) def create_user(sender, instance, created, **kwargs):     if created:         print("New user created!") post_save.connect(create_user, sender=User)在上例中我们使用了信号(post_save)自带的connect的方法将自定义的函数与信号发出者(sender)User模型进行了连接。在实际应用中一个更常用的方式是使用@receiver装饰器实现发送者与监听函数的连接,如下所示。@receiver(post_save, sender=User)读起来的意思就是监听User模型发出的post_save信号。123456789101112131415from django.db import models from django.db.models.signals import post_savefrom django.dispatch import receiver class User(models.Model):    name = models.CharField(max_length=16)    gender = models.CharField(max_length=32, blank=True) @receiver(post_save, sender=User)def create_user(sender, instance, created, **kwargs):     if created:         print("New user created!") 利用Django信号实现不同模型的联动更新我们再来看一个复杂一点的例子。我们有一个Profile模型,与User模型是一对一的关系。我们希望创建User对象实例时也创建Profile对象实例,而使用post_save更新User对象时不创建新的Profile对象。这时我们就可以自定义create_user_profile和save_user_profile两个监听函数,同时监听sender(User模型)发出的post_save信号。由于post_save可同时用于模型的创建和更新,我们用if created这个判断来加以区别。12345678910111213141516from django.db import modelsfrom django.db.models.signals import post_savefrom django.dispatch import receiver class Profile(models.Model):    user = models.OneToOneField(User, on_delete=models.CASCADE)    birth_date = models.DateField(null=True, blank=True) @receiver(post_save, sender=User)def create_user_profile(sender, instance, created, **kwargs):   if created:       Profile.objects.create(user=instance) @receiver(post_save, sender=User)def save_user_profile(sender, instance, **kwargs):    instance.profile.save() Django常用内置信号之前的例子中我们使用的都是post_save信号,即在模型调用save()方法后才发送信号。Django其它常用内置信号还包括:django.db.models.signals.pre_save & post_save在模型调用 save()方法之前或之后发送。django.db.models.signals.pre_init& post_init在模型调用_init_方法之前或之后发送。django.db.models.signals.pre_delete & post_delete在模型调用delete()方法或查询集调用delete() 方法之前或之后发送。django.db.models.signals.m2m_changed在模型多对多关系改变后发送。django.core.signals.request_started & request_finished Django建立或关闭HTTP 请求时发送。 如何正确放置Django信号的监听函数代码在之前案例中,我们将Django信号的监听函数写在了models.py文件里。当一个app的与信号相关的自定义监听函数很多时,此时models.py代码将变得非常臃肿。一个更好的方式把所以自定义的信号监听函数集中放在app对应文件夹下的signals.py文件里,便于后期集中维护。假如我们有个account的app,包含了User和Pofile模型,我们不仅需要在account文件夹下新建signals.py,还需要修改account文件下apps.py和__init__.py,以导入创建的信号监听函数。# account/signals.py123456789101112131415161718192021from django.db.models.signals import post_savefrom django.dispatch import receiverfrom .models import User, Profile   @receiver(post_save, sender=User) def create_user_profile(sender, instance, created, **kwargs):   if created:       Profile.objects.create(user=instance)   @receiver(post_save, sender=User) def save_user_profile(sender, instance, **kwargs):     instance.profile.save()# account/apps.py1234567from django.apps import AppConfig class AccountConfig(AppConfig):    name = 'account'     def ready(self):        import account.signals# account/__init__.py1default_app_config = 'account.apps.AccountConfig'
  • [技术干货] django中显示字符串的实例方法
    1、quicktool/view.py文件修改视图函数index(),渲染一个home.html模板,在视图中传递一个字符串名称是 string 到模板 home.html123def index(request):  string = u'这是一个由Django2.1.7版本写出的视图内容!'  return render(request, 'home.html',{'string':string})2、quicktool(应用app)下创建一个templates文件夹(模板),在templates下创建一个home.html1234567891011<!DOCTYPE html><html><head>  <title>学习Django</title></head><body>  {{ string }}  </body></html>知识点扩展:在django中,带有HTML标签的字符串,如str = "aa a",我们通过template展示在html页面中时,django会自动转义为可显示的html字符串,即将html标签的尖括号等字符转义。如字符串中的空格会显示为  ,尖括号会显示为 <、 >等等。当我们不需要此自动转换,如上述str在html页面直接显示为aa a时,可通过多种方法禁止django进行自动转义。1. 对于单个变量,可以在其后面加上safe过滤器,告诉Django这个字符串不用进行HTML转义。比如:12This will be escaped: {{ data }}This will not be escaped: {{ data|safe }}2.对于一段模板内容可以使用autoescape标签,比如:123{% autoescape off %}Hello {{ name }}{% endautoescape %}
  • [技术干货] Django URL和View的关系说明
    URL和View的关系1、每次用户发来一个HttpRequest请求,Django会用URL_pattern与请求进行匹配,匹配到第一个URL_pattern就会把请求转向对应的view2、view用来响应request,并返回response,response里可以包含网页文件呀,图片等等。所以项目中绝大部分代码均在此编写。view 可以引入通用模板来减少代码量,具体查看文档1Use generic views3、view引入HTML文件的方法:在一个app下建立一个templates文件夹,将html文件放进去该文件夹这里其实不一定要把HTML文件放在这个templates里,可以随意定义不过,需要在setting.py里,找到templates,修改DIRS:[ os.path.join (BASE_DIR,'你定义的html存放的文件夹')]在app下 view.py 文件,在里面写好view函数def 函数名(request):1return render(request,'index.html')render(渲染)需要三个变量, 第一个变量是request请求,第二个是模版所在目录,第三个是一个字典(可选),字典用于对应模板里设计的变量,可以用locals()将函数里设计的变量自动转换为字典4、在对于app下创建一个urls.py ,写入如下内容12345from django.urls import pathfrom . import viewsurlpatterns = [  path('', views.index, name='index'),]5、在项目文件夹里找到 urls.py 加入如下内容123456from django.urls import include, pathurlpatterns = [ path('polls/', include('polls.urls')), path('admin/', admin.site.urls),]对于<a>标签里的 href 可以用 {% url 'url名' %}来代替,url名指的是 urls.py 里的path('login.html/', views.my_login, name='url名'),Django 中通常使用 get_object_or_404()来捕捉 404 错误,而不用自己写 try...except123def detail(request, question_id): question = get_object_or_404(Question, pk=question_id) return render(request, 'polls/detail.html', {'question': question})补充:django中url与view配置方法django中url与view配置方法(一)url.py12345from django.conf.urls import urlfrom . import viewsurlpatterns = [ url(r'^$', views.showAssets, name='show_assets'),]views.py12345# -*- coding: utf-8 -*-from django.shortcuts import render_to_response# Create your views here.def showAssets(request): return render_to_response('assets_index.html', {})django中url与view配置方法(二)url.py123456# -*- coding: utf-8 -*-from django.conf.urls import urlfrom app001.views import IndexViewurlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^$', IndexView.as_view(), name="index"), ]views.py1234567# -*- coding: utf-8 -*-from django.views.generic.base import Viewfrom django.shortcuts import render# Create your views here.class IndexView(View): def get(self, request):  return render(request, 'index.html', {})
  • [技术干货] Django后端处理post请求的request.body中数据
    最近在写后端处理代码的时候,有时候会出现post请求获取不到数据的情况,仔细观察一下。可能和views的函数书写风格不同有关。这里记录一下两种不同风格的后端获取数据的代码。FBV基于函数的视图我们需要将request.body从json对象转换为字典。@csrf_exemptdef getMeaning(request):    if request.method == "POST":        json_str = request.body         json_dict = json.loads(json_str)         key = json_dict.get("key", None) CBV基于类的视图我们直接从request.data获取数据即可。class AchievementViewSet(ModelViewSet):    # 添加竞赛    @action(methods=['post'], detail=False)    @csrf_exempt    def add_competition(self, request, *args, **kwargs):        name = request.data.get('name', None)
总条数:21 到第
上滑加载中