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

Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项(转)的更多相关文章

  1. 工程部署从tomcat6.0迁移到jboss6.0错误总结

    2014-11-08 内容存档在evernote,笔记名"工程部署从tomcat6.0迁移到jboss6.0错误总结"

  2. [转]IIS6.0迁移至IIS7.0

    原文地址:http://www.splaybow.com/post/iis-6.0-7.0.html 公司的项目需要迁移到IIS7的目标机器中 在此做记录 原来server 2003系统 迁到2008 ...

  3. django2.0报错Cannot import name 'urlresolvers'

    刚刚从django1.1迁移到django2.0中出现一个意外的报错: google 了下,在stack.overflow上解释是说django2.0 把原来的 django.core.urlreso ...

  4. django2.0+连接mysql数据库迁移时候报错

    django2.0+连接mysql数据库迁移时候报错 情况一 错误信息 django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 ...

  5. 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 ...

  6. 【Python3.6+Django2.0+Xadmin2.0系列教程一】环境搭建及项目创建

    由于工作需要,接触了大半年时间的Django+xadmin框架,一直没空对这块对进行相关的梳理.最近在同事的怂恿下,就在这分享下笔者的学习及工作经验吧. 好了,话不多说,下面开始进入正题: 环境需求: ...

  7. Django:Python3.6.2+Django2.0配置MySQL

    持续学习Django中... Django默认使用的数据库是python自带的SQLlite3,但SQLlite并不适用于大型的项目,因此我将数据库换成了MySQL,下面介绍下Django如何配置数据 ...

  8. Python 3之Django2部署(centos7+nginx+python3+django2.0)

    前置工具,系统为centos7.5,为了方便管理,可以安装宝塔免费版本 首先, yum install -y wget && wget -O install.sh http://dow ...

  9. 基于centos7+nginx+uwsgi+python3+django2.0部署Django项目

    0.序言 本文讲解如何基于centos7+nginx+uwsgi+python3+django2.0把windows上的本地项目部署到云服务器上. 本文服务器上的django项目和虚拟环境的路径将建立 ...

随机推荐

  1. 如何整合Office Web Apps至自己开发的系统(二)

    WOPI项目的创建 首先用vs2012创建一个mvc4的程序.如图: 从上一篇我们可以知道,WOPI通讯主要通过两个服务: 一个是CheckFileInfo服务, 一个是GetFile服务. 所以下面 ...

  2. 洛谷 P2862 [USACO06JAN]把牛Corral the Cows 解题报告

    P2862 [USACO06JAN]把牛Corral the Cows 题目描述 Farmer John wishes to build a corral for his cows. Being fi ...

  3. Xshell不能连接SSH的解决(附Kali2.0 SSH连接)

    异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 异常处理汇总-开发工具  http://www.cnblogs.com/duni ...

  4. fidder及Charles使用

    1. fidder抓https包的基本配置,可参见以下博文 http://blog.csdn.net/idlear/article/details/50999490 2. 遇到问题:抓包看只有Tunn ...

  5. linux sed文本

    sed介绍 sed(stream editor)是一种非交互式的流编辑器,通过多种转换修改流经它的文本.默认情况下,sed不会改变原文件本身,而只是对流经sed命令的文本进行修改,并将修改后的结果打印 ...

  6. SQL Server 2016 的JSON功能

    测试一下基本的,从查询结果里面构造一个json 的格式 create table t1(ID int identity,name nvarchar(50),Chinese int ,Math int) ...

  7. dynamic

    dynamic的特性很多,好像和反射也有关,不过这里先介绍一个特性,关于反射的再补充. 我们来看一个方法: public virtual ActionResult Insert(T info) 有一个 ...

  8. Maven的国内镜像(解决jar下载过慢)

    Maven简介 maven作为一个项目管理工具确实非常好用,结果在使用时候,你会发现下载jar速度不如自己在网上下载.之前oschina的中央仓库可用,现在oschina的maven服务器关了,只能拿 ...

  9. CF876 D 树状数组

    大意就是放n个硬币,每次放一个计算下这种情况下的操作次数,一个操作为从左到右扫描,如果一个硬币右边是空的,就将硬币后移,否则该次操作停止. 显然发现对于一个情况,我们只要考虑最右边的空位的左侧有几个硬 ...

  10. jenkins设置CSRF 协议(CRUMB值设置)

    在关闭“”调用出现Error 403 No valid crumb was included in the request 第一种解决方式是 关闭 csrf,如上图,去掉勾就可以,但是并不推荐. 第二 ...