@chengxuyuan
2019-11-05T09:44:35.000000Z
字数 3450
阅读 577
橙旭园儿童编程
使用 Python2 转 Python3 工具 2to3 可以转转换大部分代码。
$ find -name "*.pyc" -exec rm {} +;
$ mkdir ../project_name_py2to3
$ 2to3 --output-dir=../project_name_py2to3 -W -n .
$ cp -r ../project_name_py2to3/* .
$ python manage check
...... # 解决 check 检测出的错误
Python3 环境不支持 Django2.0 以下版本。Django1.9 升级到 Django2.0 需要解决以下问题:
项目的根 urls.py 中路径配置问题。
1. 使用 path() 指定路径到不同的 app,不再支持使用 url() 指定。
2. path() 中的路径不支持正则表达式的形式。
3. include() 第二个参数必须指定 app 的名字。
4. include(),path() 从 django.urls import:
from django.urls import include, path
- url(r'^admin/', admin.site.urls),
- url(r'^projects/', include('projects.urls', namespace='projects')),
- url(r'^v3/channels/', include('channels.urls', namespace='channels')),
+ path('admin/', admin.site.urls),
+ path('projects/', include(('projects.urls', 'projects'), namespace='projects')),
+ path('v3/channels/', include(('channels.urls', 'channels'), namespace='channels')),
$ sed -i'' -e 's/from django.conf.urls import url, include/from django.urls import path, include/g' project/urls.py
$ sed -i'' -e "s/include('\(\w\+\)\.urls', namespace='\(\w\+\)')/include(('\1.urls', '\1'), namespace='\2')/g" project/urls.py
$ sed -i'' -e "s/url(r'^/path('/g" project/urls.py
is_authenticated 不再是一个函数,而是一个布尔值。
$ find -name "*.py" -exec sed -i'' -e 's/is_authenticated()/is_authenticated/g' {} +;
models.ForeignKey(),models.OneToOneField() 必须指定 on_delete 参数。
# 外键
$ find -name "*models.py" -exec sed -i'' -e 's/models\.ForeignKey(\(.*\),/models\.ForeignKey(\1, on_delete=models.CASCADE,/g' {} +
# OneToOne
$ find -name "*models.py" -exec sed -i'' -e 's/models\.OneToOneField(\(.*\),/models\.OneToOneField(\1, on_delete=models.CASCADE,/g' {} +
# 注意:还要继续处理一些重复 on_delete,还有一些不能用上面两个正则表达式修改的。
django.urls 代替了 django.core.urlresolvers。resolve(), reverse() 等函数需从 django.urls import:
$ find -name "*.py" -exec sed -i'' -e 's/django\.core\.urlresolvers/django\.urls/g' {} +;
settings.py 中的 MIDDLEWARE 要改成:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
filters.DjangoFilterBackend 都要从 django_filters.rest_framework 中引用
$ find -name "*.py" -exec sed -i'' -e 's/filters.DjangoFilterBackend/django_filters.rest_framework.DjangoFilterBackend/g' {} +;
admin 中的actions 重实现了 delete_selected 等方法的,需要重新实现 get_actions:
def get_actions(self, request):
actions = super().get_actions(request)
if 'delete_selected' in actions:
del actions['delete_selected']
actions += [delete_selected]
return actions
djago_filters 2.2.0 的 Filter 做以下改动:(name 改成 field_name, 参数用 lookup_expr指定)
- week = django_filters.NumberFilter(name='starttime__range', method='filter_week')
- day = django_filters.NumberFilter(name='starttime__date__gte', method='filter_day')
- teacher = django_filters.CharFilter(name='teacher__username')
+ week = django_filters.NumberFilter(field_name='starttime', lookup_expr='range', method='filter_week')^M
+ day = django_filters.NumberFilter(field_name='starttime', lookup_expr='date__gte', method='filter_day')^M
+ teacher = django_filters.CharFilter(field_name='teacher__username')
在 Model中用 str()代替 unicode():
$ find -name "models.py" -exec sed -i'' -e "s/def __unicode__/def __str__/g" {} +;
Python3 环境使用 json.dump() 不需要 encode('utf-8')
$ find -name "*.py" -exec sed -i'' -e "s/json\.dumps(\(.*\))\.encode('utf-8')/json.dumps(\1)/g" {} +;
Python3 环境没有默认的 sha, md5 Module.
redis.setex() 的 expire_time 在第二个参数,value 在第三个参数.
redis 读取数据时默认不会 encode(), 读取出的是:b'01234' 这种类型的数据。需要在连接池或其它初始化时加上 decode_responses=True.