这两天干了一个几斤疯狂的事情,花不到一个工作日的时间把一个线上Django项目语言版本从python2升级到Python3
1、字典的一个语法变化

Python2.7:

if dict1.haskey(key1):

Python3:

if key1 in dict1.keys():
# or
if key1 in dict1 :

2、u"strcontent"这种格式在python3里面支持,但是定义正则的ur"regexcontent"已经不支持,需要改成r"regexcontent"

3、urllib2不再支持,代替方式:

import urllib.request
resp=urllib.request.urlopen('http://www.baidu.com')
html=resp.read()
print(html)

4、HTMLParser包路径发生变化:

from html.parser import HTMLParser

5、HTMLParser的继承定制方式发生变化,初始化函数必须加上超类的初始化语句,否则会error:

object has no attribute 'convert_charrefs'
   def __init__(self):
super().__init__()
self.reset()
self.images = []

6、StringIO新的import方式:

try:
from StringIO import StringIO
except ImportError:
from io import StringIO

7、Python3的异常类体系发生变化,主基类变为Exception,以前的StandardError下线,所以出错:NameError: name 'StandardError' is not defined

8、Python3里面没有long类型,所有都是int,还有以前的那种数字后面加L的long类型定义方式L得去掉,否则报错
9、urlparse包路径改为urllib.parse,用法基本没变
10、整除法的计算机制改变了,非整除会变成小数,不会直接floor了。
11、Ubuntu下uwsgi执行环境由python2升级为python3的主要操作是apt卸载uwsgi-plugin-python,装上uwsgi-plugin-python3,当然了,还有python3版本的切换和一堆依赖的安装。

12、md5的update参数值需要encode以下:

md5.update(str1.encode('utf-8'))

13、属性和setter方法里面对实例值的定义名称不能和属性名称一样了,具体看下例中的下划线处理,如果不加那个处理,会导致stack overflow:

class Person(object):
def __init__(self, name, birthday):
self.name = name
self.birthday = birthday @property
def birthday(self):
return self._birthday @birthday.setter
def birthday(self, birthday):
self._birthday = str_to_date(birthday) @property
def age(self):
return datetime.date.today() - self.birthday def __str__(self):
return '%s,%s(%s)'%(self.name,self.birthday, self.age) person = Person('Xiao Ming','1980-10-1')

14、urllib.basejoin已经废除,用urllib.parse.urljoin代替

15、xrang全部统一成rang了

16、最后强调一下,所有的urllib.function的调用方式都已经废止,需要重新import相关新模块。

总结:修改点主要都在第三方不再维护的两个遗留库里面,特别廖雪峰的一个小lib,里面设计套路很深,用的都是传统的老api,最后实在移植成本太高,果断放弃,从pypi找了个同类的取代之。

线上Django项目python2到3升级日记的更多相关文章

  1. 线上服务器PHP版本编译安装升级全记录

    1.将原来的PHP重命名一下 cd /usr/local/bin/ mv php php.2.9 2.安装依赖 yum install gcc gcc-c++ libxml2 libxml2-deve ...

  2. eruda.js 实现线上调出控制台

    <script src="//cdn.bootcss.com/eruda/1.3.0/eruda.min.js"></script> 调用 eruda.in ...

  3. Django线上部署教程:腾讯云+Ubuntu+Django+Uwsgi(转载)

    网站名称: 向东的笔记本 本文链接: https://www.eastnotes.com/post/29 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议.转载请注明出处! ...

  4. Django项目在Linux服务器上部署和躺过的坑

    引言 在各方的推荐下,领导让我在测试环境部署之前开发的测试数据预报平台.那么问题来了,既然要在服务器上部署, 就需要准备: 1.linux服务器配置 2.linux安装python环境搭建与配置 3. ...

  5. django项目在uwsgi+nginx上部署遇到的坑

    本文来自网易云社区 作者:王超 问题背景 django框架提供了一个开发调试使用的WSGIServer, 使用这个服务器可以很方便的开发web应用.但是 正式环境下却不建议使用这个服务器, 其性能.安 ...

  6. 在PythonAnyWhere上部署Django项目

    http://www.jianshu.com/p/91047e3a4ee9 将项目放到git上,然后将pathonanywhere上的ssh传到git上,没有的话先创建,然后从git上把项目拷贝到pa ...

  7. kafka线上滚动升级方案记录

    kafka升级方案 为什么进行kafka升级 一.修改unclean.leader.election.enabled默认值Kafka社区终于下定决心要把这个参数的默认值改成false,即不再允许出现u ...

  8. 服务器上部署django项目流程?

    1. 简单粗暴 项目开发完毕,在部署之前需要再配置文件中将 ALLOWED_HOSTS配置设置为:当前服务器IP或*,如: ALLOWED_HOSTS = ["*",] 然后将源码 ...

  9. 基于Nginx和uWSGI在Ubuntu上部署Django项目

    前言: 对于做Django web项目的童鞋,重要性不言而喻. 参考:https://www.cnblogs.com/alwaysInMe/p/9096565.html https://blog.cs ...

随机推荐

  1. 常用js总结

    通过radio来显示/隐藏一个div <div id="ArbAcei" > <br/> 有无不良反应停药 <input type="rad ...

  2. Swift基础之OC文件调用Swift代码(在上次的基础上写的)

    前两天刚写过Swift调用OC,今天在原来的基础上,实现OC调用Swift. 首先,创建一个OneSwiftFile.swift文件,创建一个继承于NSObject的类(这个地方你可以自己选择继承的父 ...

  3. iOS平台添加Google Admob -2/2(Unity3D开发之八)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=572 在上一篇文章中主要是编写了 ...

  4. MyBatis主键生成器Jdbc3KeyGenerator(二)

    上一篇博客MyBatis主键生成器KeyGenerator(一)中我们大体介绍了主键生成器的接口及配置等,接下来我们介绍一下KeyGenerator的实现类Jdbc3KeyGenerator Jdbc ...

  5. 最简单的基于FFMPEG+SDL的音频播放器 ver2 (采用SDL2.0)

    ===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...

  6. iOS编程中的音频知识(二):那么多种格式我应该用哪一个?

    iPhone支持不少格式,比如AAC,HE-AAC,AMR,IMA4等等,你可以在以下网址看到比较全的格式和简要介绍: http://www.raywenderlich.com/69365/audio ...

  7. Dynamics CRM 2011/2013 section的隐藏

            代码如下 Xrm.Page.ui.tabs.get("TabName").sections.get("SectionName").setVisi ...

  8. OJ题:成绩排序

    题目描述 查找和排序 题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩 都按先录入排列在前的规则处理. 例示: jack 70 peter 96 Tom 70 smit ...

  9. 解决在onCreate()过程中获取View的width和Height为0的方法

    最近在看Android底层代码的view绘制原理的时候讲到一个很有意思的事情,也是我几年前刚开始学习Android开发的时候比较纳闷的一个问题,如果你不理解Android的底层绘制,请看我之前一片文章 ...

  10. ceres-solver库使用示例

    上一篇博客大致说明了下ceres-solver库的编译,然后形成了一个二次开发的库,下面就是用这个二次开发库来写一个简单(其实不太简单)的DEMO来演示ceres-solver库的强大.我们以求解一个 ...