@chengxuyuan
2019-11-05T09:44:35.000000Z
字数 3450
阅读 692
橙旭园儿童编程
使用 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.