Djang1.8+Python2.0遷移到Django2.0+Python3.6注意事項
參考:https://blog.csdn.net/weixin_40475396/article/details/82971541html
1. 編碼
unicode,str,bytes在python2和python3中的叫法以及相互轉換,具體爲:python
- 在Python3中的str對象在Python2中叫作unicode,但 bytes 對象在Python2中叫作str,若是想獲得一個文本字符串,須要在字符串以前加上前綴 u 或者decode一下。
- 項目中的問題:① python2項目中字符串前加的u能夠去掉了,由於在python3中就是一個文本字符串,也就是str對象,②獲取阿里雲簽名的視圖函數,涉及到編碼問題,須要處理
- 編碼問題參考:https://blog.csdn.net/yanghuan313/article/details/63262477
2. Model外鍵
- python3中Model中字段的外鍵必須設置on_delete,通常設置爲
on_delete=models.DO_NOTHING
,表明刪除與關聯內容無關
- 同一張表多個字段引用相同的外鍵須要設置related_name
- Model外鍵問題參考:https://blog.csdn.net/lht_521/article/details/80605146
3. 判斷是不是匿名用戶
- django1.8.2是is_anonymous()
- django2.0是is_anonymous
4. Exception
-
-
-
-
-
-
-
-
-
-
- raise異常直接寫字符串到異常中,例如:
-
-
raise SimpleAjaxException,'Return data should be follow the Simple Ajax Data Format'
-
-
raise SimpleAjaxException('Return data should be follow the Simple Ajax Data Format')
5. urls.py
- 靜態文件收集:
django1.8: url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT})
django2.0:
-
from django.views.static import serve
-
url(
r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT})
- 導入的文件時,同目錄下,不能再直接import了,使用from . import **,
- 絕對導入相對導入參考:https://www.jianshu.com/p/5cc20b88bcf4
6. 中間件類繼承
- django1.8.2繼承的是object
- django2.0繼承的是MiddlewareMixin,導入方法:
from django.utils.deprecation import MiddlewareMixin
7. 字典Dict
- Python 3.0 內的另外一個重大改變是字典內dict.iterkeys(),dict.itervalues(),dict.iteritems()方法的刪除。取而代之的是:dict.keys(),dict.values(),dict.items()
- dict.haskey()在Python2中存在,可是在Python3中更改成contains_
8. seetings設置
- Django1.8.2中間件配置名稱是MIDDLEWARE_CLASSES,Django2.0是MIDDLEWARE
9. 緩存問題
- 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密碼是否一致。數據庫
-
def getattribute(self, item):
-
if item == 'getsessionauthhash':
-
-
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
-
from django.contrib.auth.hashers import PBKDF2PasswordHasher
-
class CustomPBKDF2PasswordHasher(PBKDF2PasswordHasher):
-
11.附上更改過程當中看到的不錯的文章:
1)Python3.x新特性以及十大變化緩存
2)Django從1.8升級到2.0注意事項session
3)Django 外鍵ForeignKey中的on_delete函數