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中的叫法以及相互转换,具体为:
- 在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
- python2捕获异常是:
- try:
- Exception,e
- pass
- python3捕获异常是:
- try:
- Exception as e
- pass
- raise异常直接写字符串到异常中,例如:
- 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')
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':
- 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
11.附上更改过程中看到的不错的文章:
Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项(转)的更多相关文章
- 工程部署从tomcat6.0迁移到jboss6.0错误总结
2014-11-08 内容存档在evernote,笔记名"工程部署从tomcat6.0迁移到jboss6.0错误总结"
- [转]IIS6.0迁移至IIS7.0
原文地址:http://www.splaybow.com/post/iis-6.0-7.0.html 公司的项目需要迁移到IIS7的目标机器中 在此做记录 原来server 2003系统 迁到2008 ...
- django2.0报错Cannot import name 'urlresolvers'
刚刚从django1.1迁移到django2.0中出现一个意外的报错: google 了下,在stack.overflow上解释是说django2.0 把原来的 django.core.urlreso ...
- django2.0+连接mysql数据库迁移时候报错
django2.0+连接mysql数据库迁移时候报错 情况一 错误信息 django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 ...
- python2.X现在不能安装Django了:Collecting django Using cached Django-2.0.tar.gz
使用pip安装django2: pip install django 报错: Collecting django Using cached Django-2.0.tar.gz Complete ...
- 【Python3.6+Django2.0+Xadmin2.0系列教程一】环境搭建及项目创建
由于工作需要,接触了大半年时间的Django+xadmin框架,一直没空对这块对进行相关的梳理.最近在同事的怂恿下,就在这分享下笔者的学习及工作经验吧. 好了,话不多说,下面开始进入正题: 环境需求: ...
- Django:Python3.6.2+Django2.0配置MySQL
持续学习Django中... Django默认使用的数据库是python自带的SQLlite3,但SQLlite并不适用于大型的项目,因此我将数据库换成了MySQL,下面介绍下Django如何配置数据 ...
- Python 3之Django2部署(centos7+nginx+python3+django2.0)
前置工具,系统为centos7.5,为了方便管理,可以安装宝塔免费版本 首先, yum install -y wget && wget -O install.sh http://dow ...
- 基于centos7+nginx+uwsgi+python3+django2.0部署Django项目
0.序言 本文讲解如何基于centos7+nginx+uwsgi+python3+django2.0把windows上的本地项目部署到云服务器上. 本文服务器上的django项目和虚拟环境的路径将建立 ...
随机推荐
- sql server 小技巧(5) Sql server 获取指定字符后的所有字符 - 去掉指定字符前的所有字符
select top 10 SUBSTRING( sproductcode, CHARINDEX('-', SProductCode)+1, LEN(SProductCode)) from csmr ...
- 【转】keil5 missing close quote 错误解决
在使用utf8保存文件的情况下,代码中出现中文字符串会提示missing close quote解决:Options for Target --> C/C++ --> Misc Contr ...
- ssh框架配置过程
1.pom.xml配置依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...
- composer require 本地包(用于开发使用)
修改 composer.json "repositories": [ { "type": "path", "url": ...
- 20155339 2016-2017-2 《Java程序设计》第8周学习总结
20155339 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章NIO与NIO2 NIO使用频道来衔接数据节点,在处理数据时,NIO可以让你设定缓冲 ...
- 20155227 2016-2017-2 《Java程序设计》第五周学习总结
20155227 2016-2017-2 <Java程序设计>第五周学习总结 教材学习内容总结 语法与继承架构 使用try...catch JVM会尝试执行try区块中的程序代码,如果发生 ...
- ListView position
在使用listview的时候,我们经常会在listview的监听事件中,例如OnItemClickListener(onItemClick)中,或listview的adapter中(getView.g ...
- 存储之磁盘阵列RAID
存储之磁盘阵列RAID RAID是由美国加州大学伯克利分校的D.A. Patterson教授在1988年提出的.RAID名为独立冗余磁盘阵列(RedundantArray of Indepe ...
- 【源码阅读】Mimikatz相关资料
Mimikatz GitHub (源码) https://github.com/gentilkiwi/mimikatz Mimikatz GitHub Wiki (包含了一些说明文档) https:/ ...
- 网易与Google合作发布开源UI自动化测试方案 牛逼:Google 方面评价,这可能是目前世界上最好的 Android 游戏自动化测试方案。
美西时间 3 月 19 日,在 GDC 开幕第一天的 Google 开发者专场,Google 发布了一款由网易研发的 UI 自动化测试方案:Airtest Project.Google 方面评价,这可 ...