unicode,str,bytes在python2和python3中的叫法以及相互转换,具体为:
on_delete=models.DO_NOTHING
,代表删除与关联内容无关python2捕获异常是:
try:
Exception,e
pass
python3捕获异常是:
try:
Exception as e
pass
python2:
raise SimpleAjaxException,'Return data should be follow the Simple Ajax Data Format'
python3:
raise SimpleAjaxException('Return data should be follow the Simple Ajax Data Format')
url(r'^static/(?P.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT})
django2.0: from django.views.static import serve
url(r'^static/(?P.*)$', serve, {'document_root': settings.STATIC_ROOT})
from django.utils.deprecation import MiddlewareMixin
如果两个项目共用一个用户系统,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':
raise AttributeError
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类:
from django.contrib.auth.hashers import PBKDF2PasswordHasher
class CustomPBKDF2PasswordHasher(PBKDF2PasswordHasher):
iterations = 20000
1)Python3.x新特性以及十大变化
2)Django从1.8升级到2.0注意事项
3)Django 外键ForeignKey中的on_delete
4)Python2.7X与Python3.X的主要区别