django从1.11升级到2.1.5

升级开发环境的时候把python从2.7升级到了3.7,同时把django从1.11直接升级到了2.1.5

原文地址http://www.wantchalk.com/c/language/python/2019/01/31/update-django1.11-to-django2.1.5.html

昨天升级系统和开发环境,从zsh vim 到mysql, 从ruby 到java 到python,从sublime到pycharm,xcode,从jenkins到docker,nexus, 几乎所有在用的开发环境,编辑器,系统包,软件包,框架等等全部升级了一遍, 几乎所有在用的全部没有放过,连带的把生产环境也一起升级,所以包括docker的镜像也全部从新编译.

这一顿操作用了我足足两天时间.搞干净了好过年哈!

项目用的比较多的就是django了,之前一直是python2.7 +django1.11(好像是去年升级到django1.11的), 今天一咬牙直接把升级python 3.7.2, django2.1.5,于是就有非常多的痛苦的事情了.

拿重要的说吧


1.配置文件

(1).中间件配置

原来的

MIDDLEWARE_CLASSES = (
...
)

改成

MIDDLEWARE = (
...
)

(2).SessionAuthenticationMiddleware不再支持

直接注释掉

    # 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', remove from django2

(3).AUTHENTICATION_BACKENDS的配置从tuple变成array

我不记得是不是必要的了

AUTHENTICATION_BACKENDS = (
    ...
)

改成

AUTHENTICATION_BACKENDS = [
    ...
]

(4).djangorestframework的配置(非必要,如果没有使用的话)

    'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',
                                'rest_framework.filters.OrderingFilter'),

改为

    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',
                                'django_filters.rest_framework.OrderingFilter'),

oauth相关的DEFAULT_PERMISSION_CLASSES,下面这些好像都用不了了

        # 'oauth2_provider.contrib.rest_framework.IsAuthenticatedOrTokenHasScope',
        # 'rest_framework.permissions.TokenAuthentication',
        # 'rest_framework.permissions.IsAuthenticatedOrReadOnly',
        # 读写都必须经过认证
        # 'rest_framework.permissions.IsAuthenticated',

改成

'DEFAULT_PERMISSION_CLASSES': (
        'oauth2_provider.contrib.rest_framework.TokenHasReadWriteScope',
)

2.django的辅助类变更

(1).url里的include

现在要从django.url来import include, 过去是django.conf.url

(2).url里添加app_name

如果在urls.py里使用了namespace, 那么请在相应的urls文件的前面添加app_name

    # 视频
    url(r'^videos/', include('applications.videos.urls', namespace='videos')),

那么要在applications.videos.urls里添加

app_name = 'videos'

如果不这样就会报如下错误

   'Specifying a namespace in include() without providing an app_name '
django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead.

(3).如果自己实现了AUTHENTICATION_BACKENDS

那么authenticate方法做如下变化

    def authenticate(self, username=None, password=None):

改为

    def authenticate(self, request, username=None, password=None, **kwars):

(4) reverse移动了位置

from django.core.urlresolvers import reverse

改为

from django.urls import reverse

(5).django.contrib.auth里的视图做了变更

如果使用django auth里的login logout等视图,那么在url里原来你是这么写

from django.contrib.auth import views as django_auth_view

    url(r'^logout/$', django_auth_view.logout,

现在改成

    url(r'^logout/$', django_auth_view.LogoutView.as_view(),

另外如果使用了自定义模板,原来你是这么写的

    url(r'^login/$',
        auth_views.login,
        {'template_name': 'registration/v2/login.html'},
        name='login'),

现在要改成

     url(r'^login/$',
         auth_views.LoginView.as_view(template_name="registration/v2/login.html"),
         name='login'),

(6) unquote 和quote 这是python范畴的,我也就写这了

# 过去
from urllib import unquote
# 现在
from urllib.parse import unquote

(7)自定义标签

# 过去
@register.assignment_tag
# 现在
@register.simple_tag


3.model变化

on_delete加入强制要求

升级完很多人会遇到这个错误

TypeError: __init__() missing 1 required positional argument: 'on_delete'

过去在model定义的时候OneToOneFieldForeignKey没有强制要求, 现在强制要求要加上on_delete属性.为了快速的解决问题,我全部加上了如下代码

on_delete=models.SET_NULL
# 相应的需要把 null=True 加上

其实项目本来就应该这样去设计,我们在设计数据库的时候就应该解耦去掉关联性,另外不要轻易的删除数据. 特别是在做微服务的时候,表与表之间最好零关联

4.djangorestframework

视图里的filter_backend

过去是

    filter_backends = (filters.DjangoFilterBackend,)

现在filter做了变化

from django_filters.rest_framework.backends import DjangoFilterBackend
# 然后
    filter_backends = (DjangoFilterBackend,)

如果在settings里设置了默认的filter,可以在ViewSet里省去此属性

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容