zoukankan      html  css  js  c++  java
  • Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项(转)

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

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

    1. 编码

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

    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类:

    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注意事项

    3)Django 外键ForeignKey中的on_delete

  • 相关阅读:
    Spring Boot SockJS应用例子
    Spring Boot+STOMP解决消息乱序问题
    Spring boot集成Websocket,前端监听心跳实现
    吐槽Windows 8,就没见过这么烂的平板操作系统
    怎样在MyEclipse上耍Chrome
    HDOJ 4876 ZCC loves cards
    IIS7.5 配置 PHP 5.3.5
    关于ANDROID模拟器的一些事
    性能測试命令字段解释
    排序算法复习
  • 原文地址:https://www.cnblogs.com/it-tsz/p/10268248.html
Copyright © 2011-2022 走看看