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. 前端学习 -- Css -- 文本样式

    text-transform可以用来设置文本的大小写 可选值: none 默认值,该怎么显示就怎么显示,不做任何处理 capitalize 单词的首字母大写,通过空格来识别单词 uppercase 所 ...

  2. 解题:国家集训队 Crash 的文明世界

    题面 这种套着高次幂的统计问题一般都要用到第二类斯特林数和自然数幂的关系:$a^k=\sum\limits_{i=0}^{k}S_k^iC_a^i*i!$ 那么对于每个点$x$有: $ans_x=\s ...

  3. C++并发编程之std::future

    简单地说,std::future 可以用来获取异步任务的结果,因此可以把它当成一种简单的线程间同步的手段.std::future 通常由某个 Provider 创建,你可以把 Provider 想象成 ...

  4. gdb调试遇到的问题

    解决方法:http://stackoverflow.com/questions/31062010/ubuntu-14-04-gcc-4-8-4-gdb-pretty-printing-doesnt-w ...

  5. eos源码剖析之controller

    controller::block_status,区块状态枚举类,包括: irreversible = 0,该区块已经被当前节点应用,并且被认为是不可逆的.validated = 1,这是由一个有效生 ...

  6. linux ------ 使用 TFTP 在两个主机之前传输文件

    TFTP是用来下载远程文件的最简单网络协议,它是基于UDP协议而实现.嵌入式linux的tftp开发环境包括两个方面:一是linux服务器端的tftp-server支持,二是嵌入式目标系统的tftp- ...

  7. 安装【Jenkins】

    前言      jenkins的一款持续集成工具,      它可以做的事情很多,其中一个主要的功能就是简化部署流程          回想一下我们的发布流程:           1.本地把项目打包 ...

  8. 小贾漫谈——Java反射

    一.Class的API 二.测试使用的JavaBean class Admin{ //字段 public String userName; public String pwd; private int ...

  9. C语言复习---用筛选法求100之内的素数

    #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int i, j; ] ...

  10. 流媒体技术学习笔记之(十三)Windows安装FFmpeg

    一.下载地址: 网址:https://ffmpeg.org/ 选择Windows版本:https://ffmpeg.org/download.html#build-windows 二.解压安装: 下载 ...