51Testing特邀嘉宾刘一凡谈python从2.7升级到3的注意事项
本文最先在 51Testing 发表,作者是刘一凡,他是 51Testing 的特邀嘉宾。以下内容是 51Testing 整理的对话实录:

[id_[id_1292273015]89745060]
在 django+python27+mysql 的生产环境中,想要换成 python3,需要了解哪些注意事项呢?因为担心生产环境数据被破坏,所以不敢轻易进行更换操作,希望有经验的大神能够给予指点。
[id_990984651]
关于python升级:
能够利用 Python3 所自带的工具 2to3,把 python2 的代码转变成 python3 的代码。有一小部分代码依然需要通过手工的方式进行转换。
升级 python 版本之后,第三方包的版本需要进行升级。有一些第三方包不支持 python3 。在这种情况下,可以试着使用 2to3 工具对第三方包的 python 源代码进行转换,之后再使用。此过程存在一定风险。如果无法转换,就需要寻找替代包,并且应用服务器上对应的代码也需要进行修改。
[id_2079371114]
django 从 1.5 起开始支持 python3 。并且 django1.11 是支持 python2 的最后一个版本。若使用的 django 版本大于或等于 1.5 ,那么 django 版本可以不进行升级。倘若 django 版本低于 1.5 ,就需要对 django 版本进行升级。在升级 django 版本之后,对于新版本不兼容的老的 API 都需要进行修改。这个工作量比较大。
升级了 django 版本之后,为 django 服务的那些第三方包需要进行相应的升级。建议不要让 django 立刻使用最新的版本,因为这样可能会导致第三方包还无法支持最新的 django 版本。
关于mysql:
Mysqldb 不具备对 python3 的支持,必须要运用 mysqlclient 来充当数据库的 API 驱动。
[id_230015035]
一般性的版本升级注意事项。
代码和数据做好备份
python和django升级后,上线前需要充分测试。
02
刚在学习 django 的 nginx 部署,一直对处理高并发的原理不太清楚,大神能否给解释一下呢?
答案
我简单说一下我的理解。
django WSGI 是单线程的。这意味着只有一个请求处理完毕后,才能响应另一个请求。
uWSGI 是用 C 语言书写的。uWSGI 与 Django 相结合,相比单独使用 Django 而言。它通过多进程的方式,能够发挥多核的优势。所以它支持的并发量更高。
uwsgi服务器运行在django一侧。
uWSGI 以 C 语言编写,它与 Django 相比,在单独使用 Django 的基础上,通过使用多进程,能够发挥多核的优势,从而支持更高的并发量。uWSGI 中存在 master 进程和 worker 进程。master 进程会依据配置创建相应数量的 worker 进程。一个 worker 进程被创建后,它会运行一个 python 解释器实例。在 worker 进程被销毁之前,它会一直使用这个实例。master 会将收到的 http 请求分配给 worker 去处理。worker 进程会调用 python 脚本来处理 http 请求。一个 worker 进程会反复被用于处理很多个 HTTP 请求。woker 进程的数量需要比 CPU 的内核数量大。接着要依据 CPU 的利用率来增加进程的数目。
03
我的系统需要一个功能,即当一个任务到达某个特定状态时,如果在 24 小时内没有任何人进行操作,就会自动切换到另一个状态。每个用户都有不同的任务,有点类似于百度外卖下单后等待商家接单的情况。有没有可以方便地与 django 整合在一起的框架呢?django-celery 怎么样呢?
答案
[id_361057328]
用户下单之后,其订单信息会被写入数据库。商家接单之后,会对数据库中用户的订单状态进行修改。
关于定时器:可以考虑利用 django-celery 来创建一个线程,用于进行异步处理。在 24 小时之后,对数据库中用户的订单状态进行检查。倘若此时仍然没有商家接单,那么就修改订单状态。不过,这样做可能会导致线程数量过多,从而使得资源消耗过大。能够利用 django-celery 来设置循环任务。例如,每隔 5 分钟去查询数据库中那些已经超过 24 小时,然而依旧没有商家接单的订单,接着对这些订单的状态进行修改。
04
如何运行 Django 中的程序呢?因为比赛有需求,需要对 Django 框架中的软件进行解释。我学的是 Java,未曾接触过 Python 的框架。请问入口在哪里?该怎么运行呢?
答案
我的教程“Python Django 带你构建 Web 应用”中有这个操作。
进入 django 项目的根目录。然后运行 python manage.py runserver 来启动内置的 Web 服务器。该服务器默认提供服务的 IP 地址是 127.0.0.1,端口为 8000。
如果想要对外提供服务,那么可以修改为真实的 IP 地址。例如,若想使用 1.1.1.1:8080 对外提供服务,就需要在 settings.py 中修改 ALLOWED_HOSTS 的内容,将其修改为 ALLOWED_HOSTS = [‘1.1.1.1’,]。运行内置的 Web 服务器,即执行 d:\django\web> python manage.py runserver 1.1.1.1:8000 这个操作。
05
想请教你一个问题:是否可以用 django 来制作旅游调查网站呢?通过对班级同学的旅游意向进行调查,把相关信息存入数据库,接着进行简单的分析,从而得出最佳旅游地点,这种想法是否可行呢?
答案
第一部分的需求与存储信息相关且与 django 有关。它是一个简单的 Web 应用。通过表单来获取同学们的旅游意向。由于数据量较小,所以能够直接把数据存入 SQLite 数据库里。此内容在“Python Django 带你构建 Web 应用”课程中有所讲解。
第二部分进行数据分析和结果展示时,不一定非得依靠 django。可以根据需求从数据库里提取信息来展开分析。倘若分析较为复杂,能够运用 numpy 和 pandas 来进行分析,并且使用 matploitlib 来展示分析结果。
06
原本准备开发一个 web 应用,主要供网站和客户端(pda)访问。如今网站使用 django 很便捷就完成了。在客户端(pda)方面,原本的想法是使用 webservice,但不确定是否可以直接使用 django 来实现。想知道是否能不用 webservice,仅通过 django 就搞定,希望能获得解决方案并普及相关知识。
答案
可以利用 Django REST framework 去达成 RESTful web service 。
07
如何以最高效的方式利用 django 来进行快速开发?或者可以问,django 的哪些部分能够帮助实现快速开发?
答案
我觉得django开发快的原因在于:
Python 首先是一种动态类型语言,它使用起来较为灵活,并且开发速度较快。
其次,将 django 与另一个常用的 python web 框架 flask 进行对比。django 所提供的功能更为全面。django 属于重量级框架。而 flask 是轻量级框架,其很多基本功能都需要自身去实现或者借助第三方组件,不过它在使用上较为灵活。
django 有诸多优点。其一,内置功能较为完善且强大,像表单、认证、权限控制、文件上传、测试、国际化、分页、序列化、会话、数据验证以及异常处理等方面都有涉及。其二,使用起来较为方便,很多功能无需程序员自行去实现。其三,拥有强大的 ORM 机制。其四,具备强大的 admin 站点。其五,url pattern 灵活且易用。其六,APP 具有可插拔性。其七,错误提示信息十分详细。其八,官方文档也较为完善。
其三,django 为了实现表现和逻辑的分离,使得 DTL 功能相对较弱。
根据需求来选择框架。如果是快速开发,就选择 django。如果是深层次定制,就选择 flask。
08
我在使用终端创建 django 项目的时候,系统提示 django-admin: command not found 。然而,当我运行 Python 并导入 django 时,却可以正常进行。这到底是哪里出现了错误呢?并且之前我是成功创建过的,您能帮我解答一下吗?
答案
如果 python 的安装目录是 D:\Python36\,那么在安装 django 之后,django-admin.exe 位于 D:\Python36\Scripts\中。并且需要把 D:\Python36\Scripts\添加到系统变量 Path 里。
09
想问一下,现在有一个“性别”字段的分组查询。我希望能够统计出其中男女生各自的人数。我想用分组查询的办法来实现这个目标。但是我找不到相关的示例代码,希望老师能够赐教。
答案
类似查询每个用户写了多少篇blog
从 django.db.models 中进行导入。获取到的是 Count 这个对象。numbers 这个变量被赋值为某个特定的结果。
获取 Blog 模型对象的 username 字段值,然后对这些 username 进行计数统计,统计结果命名为 blog_count,最后按照一定顺序进行排序。具体来说,就是先从数据库中提取出所有 Blog 对象的 username 字段值,接着对每个不同的 username 进行计数,得到每个 username 对应的 blog_count,最后按照某种规则对这些包含 username 和 blog_count 的记录进行排序。
等效于SQL语句:
从 Blog 表中选择 username 列,计算每个 username 对应的记录数量,然后按照 username 进行分组
得到的QuerySets numbers的值是:
因为 model 里面定义了 class meta: ordering,所以最后添加了 order_by()。
10
Django 中的通用视图是否是个难点呢?今天我花费了一整天来研究这个通用视图,然而我一点都没有理解。在网上我也未能查找到详细的资料,希望老师能够简单地给我介绍一下。
答案
django 视图最常进行的事情为:依据 url 中传入的参数,从数据里获取数据;接着加载模板;之后返回渲染后的模板。django 提供了通用视图,用以实现这一常见的流程,这样就能减少视图的代码量。
URLconf 中的参数名字可能需要进行更改。例如,DetailView 这种通用视图要求使用“pk”这个参数来表示主键。
在继承了通用视图类的那些视图类里,只需要把 model 和 template_name 明确指定出来,就能够将基本的流程完成。
另外还要注意context变量要和template中对应。
django2.0 的手册 2.6.2 提到了使用通用视图,并且说明了代码越少越好。它给出了一个基本的例子。你可以尝试这个例子。
11
我曾做过一个项目。这个项目中,由于表没有关联,所以采用了非关系型数据库 mongodb。项目的开发环境是 python+django,并且部署在 ubuntu 上。在当时,使用了 pymongo 来实现 python 与 mongodb 的连接,同时用 mongoengine 完成了 django 与 mongodb 的连接。
答案
现在有新的需求,各个表之间存在关联。基于此,我打算添加一个 mysql 数据库。
请问老师,django 在展示网页时,能否同时展示 mongodb 中的表内容以及 mysql 中的表内容呢?在 settings.py 中,应当怎样去配置数据库呢?
在同一个网页中能够同时展示 Mongodb 里的数据和 mysql 里的数据。在 Django 里,只需把需要显示的内容经由 context 传递给 template 就行,而不管 context 的内容源自哪种数据库。
在 setting.py 的 DATABASES 里添加用于连接 mysql 的参数,像这样:
'db2': {
"ENGINE" 的值为 "django.db.backends.mysql"。
'NAME': 'blog',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '10.0.0.1',
'PORT': '3306',
可以设置数据库和app的映射关系
DATABASE_APPS_MAPPING = {
'app1': 'db1',
'app2': 'db2',
在查询或者修改数据库内容的时候,可以使用函数 using() 或者参数 using 来明确需要使用哪一个数据库。
12
我是一名小白,想问大神。大家都说 python django 学起来相对较简单,那么从入门到学会大概需要多长时间呢?也就是学习周期大概是多久?需要具备哪些基础呢?
答案