Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项(转)

Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项

 

参考:https://blog.csdn.net/weixin_40475396/article/details/82971541html

1. 编码

unicode,str,bytes在python2和python3中的叫法以及相互转换,具体为:python

  1. 在Python3中的str对象在Python2中叫作unicode,但 bytes 对象在Python2中叫作str,若是想获得一个文本字符串,须要在字符串以前加上前缀 u 或者decode一下。
  2. 项目中的问题:① python2项目中字符串前加的u能够去掉了,由于在python3中就是一个文本字符串,也就是str对象,②获取阿里云签名的视图函数,涉及到编码问题,须要处理
  3. 编码问题参考:https://blog.csdn.net/yanghuan313/article/details/63262477

2. Model外键

  1. python3中Model中字段的外键必须设置on_delete,通常设置为on_delete=models.DO_NOTHING,表明删除与关联内容无关
  2. 同一张表多个字段引用相同的外键须要设置related_name
  3. Model外键问题参考:https://blog.csdn.net/lht_521/article/details/80605146

3. 判断是不是匿名用户

  1. django1.8.2是is_anonymous()
  2. django2.0是is_anonymous

4. Exception

    1.  
      python2捕获异常是:
    2.  
      try:
    3.  
      Exception,e
    4.  
      pass
    5.  
       
    6.  
      python3捕获异常是:
    7.  
      try:
    8.  
      Exception as e
    9.  
      pass

     

  1. raise异常直接写字符串到异常中,例如:
    1.  
      python2:
    2.  
      raise SimpleAjaxException,'Return data should be follow the Simple Ajax Data Format' 
    3.  
      python3:
    4.  
      raise SimpleAjaxException('Return data should be follow the Simple Ajax Data Format')

     

5. urls.py

  1. 静态文件收集:
    django1.8:
    url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}) 
    django2.0:
    1.  
      from django.views.static import serve 
    2.  
      url( r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT})
  2. 导入的文件时,同目录下,不能再直接import了,使用from . import **,
  3. 绝对导入相对导入参考:https://www.jianshu.com/p/5cc20b88bcf4

6. 中间件类继承

  1. django1.8.2继承的是object
  2. django2.0继承的是MiddlewareMixin,导入方法:
    from django.utils.deprecation import MiddlewareMixin

7. 字典Dict

  1. Python 3.0 内的另外一个重大改变是字典内dict.iterkeys(),dict.itervalues(),dict.iteritems()方法的删除。取而代之的是:dict.keys(),dict.values(),dict.items()
  2. dict.haskey()在Python2中存在,可是在Python3中更改成contains_

8. seetings设置

  1. Django1.8.2中间件配置名称是MIDDLEWARE_CLASSES,Django2.0是MIDDLEWARE

9. 缓存问题

  1. Python2和Python3对换错的哈希方式不一样,上线的时候最好是把缓存清一下。
    Bug:上线Python3,由于用户系统问题,上线失败,退回到Python2,此时由于有Python3的缓存,而版本是Python2的版本,致使报错。
    解决方式:清除缓存。

10. 用户系统问题

若是两个项目共用一个用户系统,Django2.0项目的用户在登录状态,若是此时Django1.8项目登录此用户,再次刷新Django2.0项目的此用户,就须要从新登陆。
此问题是由于Django1.8和2.0中间件对哈希的密码校验问题不一样致使的request请求时,对象中的 session_id 消失,最终致使数据库中session被清除,目前能暂时解决,绕过这个问题,还没有找到根本缘由。
解决办法: 
1)在用户表的Model里面添加方法,至关于撤回到python2的验证机制,强制绕过这个登录时校验密码hash以后跟缓存中的hash密码是否一致。数据库

  1.  
    def getattribute(self, item):
  2.  
    if item == 'getsessionauthhash':
  3.  
       raise AttributeError
  4.  
    return super().getattribute_(item)

2) 回归到第一条,校验用户时,对密码hash,是经过一个固定的值加密码hash的,django1.8和2.0这个固定的值不一样,致使密码hash以后跟缓存中的hash密码不一致,若是将不一样版本的这个值设为相同的话,就ok了,其实settings.py里面就能够设置,只是不一样版本有默认值,就没有在显示设置。以下:
PASSWORD_HASHERS = [ 'core.hasher.CustomPBKDF2PasswordHasher'] 
而后再相对于的路径建立文件重写类:好比上面就是在core文件夹下的hasher.py文件重写CustomPBKDF2PasswordHasher类:django

  1.  
    from django.contrib.auth.hashers import PBKDF2PasswordHasher
  2.  
    class CustomPBKDF2PasswordHasher(PBKDF2PasswordHasher):
  3.  
      iterations = 20000

11.附上更改过程当中看到的不错的文章:

1)Python3.x新特性以及十大变化缓存

2)Django从1.8升级到2.0注意事项session

3)Django 外键ForeignKey中的on_delete函数

相关文章
相关标签/搜索