那些年在win下填过的Django坑

时间:2022-04-25
本文章向大家介绍那些年在win下填过的Django坑,主要内容包括坑1:python2还是python3?、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

專 欄

JacobYRJ,Python中文社区专栏作者

Python语言爱好者,目前在做Django项目。

Github博客:https://JacobYRJ.github.io

导言

对于大多数在win下做开发的道友来说,坑就像无底洞永远填不完,还一个接一个。最近我的电脑硬盘被win10的自动更新摧毁了,辛辛苦苦弄好的配置全没了,安装的资源包都没有备份,于是所有东西都要重新开始。然后我从anaconda下载到Django成功启动项目遇到好几个之前初学时没留意到的坑,也就是这些坑,为了尽可能完善我花费了近2周的时间去填,同时也因为我能力有限,有部分坑还未填满,所以我就写这篇文章是抛砖引玉了,如有其他较好的解决方案欢迎联系我!

操作环境: - win10专业版64位 - anaconda3-4.3.0.1 - python3.6.0.final.0 - Django1.10.0.fianl.1 - MySQL: Ver 14.14 Distrib 5.7.17,for Win64(x86_64) 需要用到的库: - virtualenv - pymysql

坑1:python2还是python3?

当初我学Django的时候,由于网上比较多教程是使用python2.7,所以我很理所当然地选了python2.7,前期连接操作数据库的时候也没怎么遇到坑,可是时至今日,我倾向于python3,Django开始慢慢倾向python3,官方文档就是用python3.4,另一个重要原因是Django默认模型处理格式是Unicode编码,python3恰恰就是Unicode默认编码(python2是str),所以python3成为我安装的首选,当然,我安装的是Anaconda3,比较省心(初探Anaconda——最省心的Python版本和第三方库管理) 然后安装virtualenv,启动再装Django,最后

conda install mysql-python

前面挺顺利,到mysql-python这步我就蒙蔽了,安装失败,第一个坑!

坑的原因在MySQL官网找到了,MySQL-python并不支持python3.6 = =!

开玩笑吗?Django叫我装python3,MySQL又不支持python3,这是要分家的节奏吗?所以我要装python2还是装python3?

填坑1:装python3

站在后续发展大方向上,个人认为python3会逐渐显示出她的魅力。那么python3没有MySQL-python怎么连接数据库呢?答案就是

pip install pymysql

在python3.6的库里边这有两个可以连接MySQL数据库,这里我们只安装第二个pymysql

安装完成后,配置settings.py,如果你直接执行manage.py的命令会出现Import MySQLdb Error导入MySQLdb错误,原因就是包路径没有'MySQLdb'这个库,只有'pymysql',我们要告诉项目库换了。方法:在项目mysite/mysite/__init__.py 就是和settings.py同目录的__init__.py下添加下面代码:

import pymysqlpymysql.install_as_MySQLdb()

到此问题就解决,如果在python shell连接数据库的话,依然可以按照python2那样进行操作,Import MySQLdb也不会出错。

坑2:MySQL编码问题:中文乱码

编码问题,不管走到哪都会遇到,这是个大坑!如果你是用python2的话,在models.py开头就应该加上coding:utf8' 强制使用utf8方式编码,如果是python3的就不需要,因为python2是默认gbk,python3默认utf8。并且在创建数据库是就应该设置编码方式为utf8

mysql>create database mydb character set utf-8;

这样的话可以从一开始就规避中文乱码这个坑。如果你觉得这样很麻烦,那就试试从MySQL本身入手,更改默认编码方式。

首先检查MySQL编码方式:

如果你的和我的编码方式都不全是utf8的话,恭喜了,你可以继续阅读,因为下面可能是你需要的

填坑2:更改MySQL默认编码为utf8

首先你要知道你家MySQL的配置文件my.ini在哪,一般就是在当初安装时选择安装的目录下,大对数情况'my.ini'并不叫'my.ini',而是my-default.ini,但是没关系,找到这个文件,直接重命名就行,但一定要重命名为my.ini,否则配置无法生效!忘记安装位置的可以在环境变量PATH中找到。

找到后用编辑软件打开, 在[client]、[mysql]下都加入一句default-character-set=utf8 ,在[mysqld]下加[character-set-server=utf8]。如果已经有的话就不用加,如果是gbk就改成utf8,就像这样:

改好配置后就需要重启服务使配置生效,在管理命令端(win+c,a)输入

net stop MySQLnet start MySQL

MySQL是服务名称,也可以进入管理服务窗口,手动重启服务器。

完成后,就可以正常显示中文并且以后创建新的数据库除非指定,否则默认utf8。

可是即便如此我还是有点不放心,那就试试直接修改数据库编码吧。举个例子,我Django使用的数据库名为'mydb',那就进入数据库储存目录'etcMySQLMySQL Server 5.7Datamydb' 找到db.opt文件,然后修改为utf8,就像这样:

如此就能保证编码方式一定是utf8。

还有另外一种方式,可修改MySQL编码,就是使用set character_set_xx=utf8

直到全部都是utf8,就像这样:

但是这种方式只对当前有效,也就是说退出重开后就会打回原形,并不能根本上解决问题。

到这里MySQL编码就告一段落了!

花絮1:Anaconda不是能同时用python2和3吗,为什么还纠结?

当时我遇到坑1的时候就想到既然anaconda能装两个版本的python,为什么不用python2操作数据库,用python3写models呢?于是乎我就利用conda命令创建了python2的环境,然后激活,二话不说就准备启动virtalenv直接刚,结果就尴尬了。事实上anaconda创建python2环境是一种虚拟环境,原理和virtualenv一模一样,甚至虚拟环境名也是用env,所以在虚拟环境里再搞个虚拟环境,这能好吗?我也挺服了我自己 = =!

花絮2:同时安装Anaconda2和Anaconda3会怎样?

对!这种事我在填坑1也做过,两个版本的Anaconda都能成功安装,但是后来安装的版本在cmd使用python是无效的,换句话说,默认的python版本只能有一个并且是最先安装的那个,我尝试过修改环境变量PATH的位置顺序,然而并不能改变什么,所以后来我直接卸载了Anaconda2,留下了Anaconda3。

花絮3:conda和pip安装有什么不同?

两个工具都能安装现有的库,只是资源地址不一样,并且cond需要修改镜像源为国内清华大学的镜像源才能下载。除了这点外,还有启动虚拟环境env后安装库的位置也有不同,在env内使用pip install 的库会直接安装到虚拟环境env内,这样在env的python端Import导入这个库就能成功,相反,用conda install安装的库会放到anaconda的根目录site-packages下,在虚拟环境env并不会安装这个库,所以想在env顺利Import这个库的话还要从site-packages复制过来。

花絮4:我找到不只一个my-default.ini,到底哪个才是?

在填坑2的时候,找这个配置文件的时候花了我挺多时间,因为我的电脑安装后名为MySQL的文件就有三个,分别在安装目录D盘、C盘的'Pragramin Files'和'ProgramData',而且里面的文件都差不多一个样,然而重点是的配置文件'my.ini'只有在'ProgramData'有,其他两个却叫'my-default.ini',并且这'my.ini'里面包含其他两个没有的很多参数,更加重要的是在MySQL服务管理的属性栏可以看到,配置文件就是'ProgramData'文件的这个'my.ini',所以我一度坚定地毫不怀疑地认为它就是我要的那个'my.ini'。

于是我就开始改,改完了重启服务,查看默认编码,不行,再改,再重启,还是不行,然后上网各种查,甚至一度删服务重新install,坑爹的还是显示gbk编码,中文依然乱码,后来准备放弃时,跑去改原本不看好的安装目录那个'my-default.ini'并且重命名后,重启服务,查看编码,结果真是柳暗花明又一村!成功了!唉~可能这就是命吧。。。