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函數

相關文章
相關標籤/搜索