本篇文章给大家谈谈为什么django2在python2下可用?,以及为什么使用django框架的知识点,同时本文还将给你拓展$Django多表操作(增删改查,基于双下划线,对象的查询)在Python脚
本篇文章给大家谈谈为什么django 2在python 2下可用?,以及为什么使用django框架的知识点,同时本文还将给你拓展$Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境、Centos7.2下nginx+uwsgi+python/Django搭建生产环境、Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项(转)、django 为什么不主流,python 不是比 java 更优雅吗?等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:- 为什么django 2在python 2下可用?(为什么使用django框架)
- $Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境
- Centos7.2下nginx+uwsgi+python/Django搭建生产环境
- Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项(转)
- django 为什么不主流,python 不是比 java 更优雅吗?
为什么django 2在python 2下可用?(为什么使用django框架)
根据Django 2.0发行说明,
Django 2.0及更高版本将仅支持python 3,从而使1.11.X成为支持python 2的最后一个发行系列。
请参阅发行说明页面中的报价:
Django 2.0支持Python 3.4、3.5和3.6。我们强烈建议并仅正式支持每个系列的最新版本。
Django 1.11.x系列是最后一个支持Python 2.7的系列。
但是,在运行时pip2 install Django
,将安装django版本2(然后失败,因为它假定功能在python 2中不可用):
(venv-crap) mbp15:server nir$ pip2 install django
Collecting django
Downloading Django-2.0.tar.gz (8.0MB)
100% |████████████████████████████████| 8.0MB 177kB/s
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "<string>",line 1,in <module>
File "/private/PATH/django/setup.py",line 32,in <module>
version = __import__('django').get_version()
File "django/__init__.py",in <module>
from django.utils.version import get_version
File "django/utils/version.py",line 61,in <module>
@functools.lru_cache()
AttributeError: 'module' object has no attribute 'lru_cache'
----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /private/PATH/django/
我知道我可以手动指定2以下的要求版本,使pip安装对python
2有效的版本,但是如果我要同时支持python2和python3,这会使安装过程复杂化,并且假设pip会知道仅安装兼容版本与它从运行的Python。
因此,我的问题如下:
- 为什么pip尝试使用python2安装Django2,而不是自动选择最新的兼容版本?那不是
pip
功能的一部分吗? - 有没有一种方法可以使从python2运行和与python3运行时
requirements.txt
安装的单个安装?Django<2.0``Django>=2.0
$Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境
0在Python脚本中调用Django环境、
import os
if __name__ == ''__main__'':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "工程名.settings")
import django
django.setup()
from app01 import models
1 创建多表模型(详情见代码)
#用了OneToOneField和ForeignKey,模型表的字段,后面会自定加_id
class Zuozhe (models.Model):
id = models.AutoField (primary_key=True)
name = models.CharField (max_length=32)
xiang = models.OneToOneField (to=''Xiang'', to_field=''id'')
# ManyToManyField会自动创建第三张表:格式如下
class Zuozhe (models.Model):
id = models.AutoField (primary_key=True)
class Books (models.Model):
id = models.AutoField (primary_key=True)
name = models.CharField (max_length=32)
price = models.DecimalField (max_digits=5, decimal_places=2)
banse = models.ForeignKey (to=Banse, to_field=''id'')
zuozhe = models.ManyToManyField (to=''Zuozhe'')
# *************重点
# 一对一的关系:OneToOneField
# 一对多的关系:ForeignKey
# 多对多的关系:ManyToManyField
2 添加表记录
1 一对多create
-两种方式:
-publish=对象 #创建时的字段=对象
-publish_id=id #数据库里的实际字段=id
models.Book.objects.create(name=''红楼梦'',price=34.5,publish_id=1)
publish=models.Publish.objects.get (pk=1)
models.Book.objects.create (name=''西游记'', price=34.5, publish=publish)
2 一对多删除:同单表删除 delete()
3 一对多修改:两种方式,可以传对象,可以传id, update()
4 一对一跟一对多一样
5 多对多: 注意这里是拿到对象在 增删改
-add ----->可以传对象,可以传id,可以传多个
# book=models.Books.objects.filter(name=''添加1'').first()
# book.zuozhe.add(1,2)
-remove ----->可以传对象,可以传id,可以传多个
-clear ---->没有参数
-set 修改 ----->必须传可迭代对象(一般列表),列表里面可以是对象,可以是id (举例:这本书的作者,set([1,2,3] 表里有就不改动了,没有添加,这本书之前的其他作者删除))
book=models.Books.objects.filter(name=''添加1'').first()
book.zuozhe.set ([3, 2, 1])
3 基于对象的跨表查询: 对象。跨表/跨表_set--->object对象 | None | None。all() 拿到一个queryset对象
1 一对一 :没有all,没_set
正向:正向查询按字段
# lqz=models.Zuozhe.objects.filter(name=''lqz'').first()
# print(lqz.xiang.address)
反向:反向查询按表名小写
# phone=models.Xiang.objects.filter(phone=''120'').first()
# print(phone.zuozhe.name)
2 一对多
正向:正向查询按字段
反向:反向按表名小写_set.all()
3 多对多
正向:正向查询按字段
# book=models.Books.objects.filter(name=''水浒传'').first()
# print(book.zuozhe.all())
# for i in book.zuozhe.all():
# print(i.name)
反向查询:反向按表名小写_set.all()
lqz=models.Zuozhe.objects.filter(name=''lqz'').first()
pp=lqz.books_set.all()
print(pp)
for i in pp :
print(i.name)
4******基于对象的查询,多次查询(子查询)
总结: 多个.all()或者小写表名_set.all()
4 基于双下划线的跨表查询
-连表查询
-一对一双下划线查询
-正向:按字段,跨表可以在filter,也可以在values中
-反向:按表名小写,跨表可以在filter,也可以在values中
# models.Books.objects.filter(name__startswith=''红'').values(''zuozhe__xiang__address'').filter(zuozhe__xiang__address__startswith=''北'').values(''zuozhe__xiang__sex'')
5.修改
models.User.objects.filter(id=1).update(name=''wd'')
Centos7.2下nginx+uwsgi+python/Django搭建生产环境
【查了很多资料并尝试,刚配置好的生产环境,记录下,免得忘了。】
python/Django在开发时使用命令如下来运行测试:
python manage.py runserver 0.0.0.0:8000
但在真正部署运行时不能这么用,得配合Nginx+uwsgi来部署(这两个做什么用网络上资料很多)。
为了省去中间繁琐的不必要的配置步骤,采用如下集成包:
Anaconda3-4.4.0 for
Linux,Python的运行环境,包含了很多常用的库,下载地址:https://repo.continuum.io/archive/Anaconda3-4.4.0-Linux-x86_64.shPHPStudy for Linux,支持Apache/Nginx/Tengine/Lighttpd,
支持PHP5.2/5.3/5.4/5.5切换 ,同时包含了MysqL数据库,下载地址:http://lamp.phpstudy.net/,这里已经包含了安装教程
将以上安装程序上传到服务器的指定目录(或使用wget下载)
一、安装Python
所申请的阿里云服务器Centos7.2默认安装了python2.7的版本,但我们开发用的是python 3.6的,所以需要再安装。
直接运行安装包:
./Anaconda3-4.4.0-Linux-x86_64.sh
PS:如果出现权限不足的提示,则使用chmod +x 添加可执行权限
等待安装结束即可。
按自己开发所需的模块执行安装:
pip install django pip install pyMysqL ......
二、安装Nginx
wget -c http://lamp.PHPstudy.net/PHPstudy-all.bin chmod +x PHPstudy.bin #添加可执行权限的设置 ./PHPstudy.bin #运行安装
按提示选择所需的版本(我用的是Nginx+PHP5.5),执行安装、编译过程,等。。。用时23分钟:
可通过以下命令管理:
服务进程管理:PHPstudy (start|stop|restart|uninstall) #默认做为系统服务随开机启动 站点主机管理:PHPstudy (add|del|list) ftpd用户管理:PHPstudy ftp (add|del|list)
这个步骤就完成了Nginx+PHP+MysqL的安装
三、配置uwsgi模块
前提:确保运行python manage.py runserver 0.0.0.0:8000能正常访问,即表示站点程序没有问题
本步骤重点参考并感谢如下博文:
http://blog.csdn.net/oushaoabc/article/details/51942355
http://www.linuxidc.com/Linux/2017-03/141806.htm
主要时间都是花在这边的配置,它主要是监听python/django的运行端口并与Nginx交互。
配置过程整理如下:
1、安装uwsgi
执行命令:
pip install uwsgi
2、在站点程序的根目录下(即与manage.py文件同级目录)
- 创建runapp.py的uwsgi运行文件,代码如下:
#coding:utf-8 import os from django.core.wsgi import get_wsgi_application os.environ.setdefault("DJANGO_SETTINGS_MODULE","sitename.settings") # 这里是你自己的项目名 application = get_wsgi_application()
主要作用是通过uwsgi来加载django程序
创建runapp.ini的uwsgi配置文件,内容如下:
[uwsgi]
http = 127.0.0.1:7070 #监听IP和端口
chdir = /www/sitename #项目根目录
module = runapp #uwsgi文件,注意不用把后缀.py加上去
processes = 4 #开启4个进程(按需更改)
threads = 2 #每个进程开启4个线程
enable-threads = True #支持线程启动
daemonize = /var/log/uwsgi.log #后台启动,并把日志记录到指定文件
buffer-size = 21573在/etc下建uwsgi7070.ini
[uwsgi] socket = 127.0.0.1:7070 master = true #主进程 vhost = true #多站模式 no-stie = true #多站模式时不设置入口模块和文件 workers = 2 #子进程数 reload-mercy = 10 vacuum = true #退出、重启时清理文件 max-requests = 1000 limit-as = 512 buffer-sizi = 30000 #pid文件,用于下面的脚本启动、停止该进程 pidfile = /var/run/uwsgi7070.pid daemonize = /var/log/uwsgi/uwsgi7070.log
运行命令
uwsgi /etc/uwsgi7070.ini
会出现如下提示:
[uWsgi] getting INI configuration from /etc/uwsgi7070.ini
Tips:这个步骤之前不懂,认为是要在浏览器中访问7070端口,但却浏览不到,以为是配错了,搞得配了好多次,多花了时间。
再用命令查看指定端口是否有线程启动:
lsof -i:7070
Tips:
可以查看/var/log/uwsgi/uwsgi7070.log日志文件中的内容判断配置及运行是否正常;
如果提示找不到lsof命令,则运行安装命令:yum install lsof -y
- 将uwsgi配置为开机启动
这个步骤建议做。其目的,是免得服务启重时都要手动执行 uwsgi /etc/uwsgi7070.ini 这个过程
在/ect/init.d/目录下新建uwsgi7070文件,内容如下(可以参考init.d目录下其他启动文件的写法):
#! /bin/sh # chkconfig: 2345 55 25 # Description: Startup script for uwsgi webserver on Debian. Place in /etc/init.d and # run 'update-rc.d -f uwsgi defaults',or use the appropriate command on your # distro. For CentOS/Redhat run: 'chkconfig --add uwsgi' ### BEGIN INIT INFO # Provides: uwsgi # required-Start: $all # required-Stop: $all # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: starts the uwsgi web server # Description: starts uwsgi using start-stop-daemon ### END INIT INFO PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/anaconda3/bin DESC="uwsgi deamo" NAME=uwsgi7070 DAEMON=/root/anaconda3/bin/uwsgi CONfigFILE=/etc/$NAME.ini PIDFILE=/var/run/$NAME.pid SCRIPTNAME=/etc/init.d/$NAME set -e [ -x "$DAEMON" ] || exit 0 do_start() { $DAEMON $CONfigFILE || echo -n "uwsgi already running" } do_stop() { $DAEMON --stop $PIDFILE || echo -n "uwsgi not running" rm -f $PIDFILE echo "$DAEMON STOPED." } do_reload() { $DAEMON --reload $PIDFILE || echo -n "uwsgi can't reload" } do_status() { ps aux|grep $DAEMON } case "$1" in status) echo -en "Status $NAME: \n" do_status ;; start) echo -en "Starting $NAME: \n" do_start ;; stop) echo -en "Stopping $NAME: \n" do_stop ;; reload|graceful) echo -en "Reloading $NAME: \n" do_reload ;; *) echo "Usage: $SCRIPTNAME {start|stop|reload}" >&2 exit 3 ;; esac exit 0 uwsgi7070
然后执行命令:
chkconfig --add uwsgi7070 #添加服务 chkconfig uwsgi7070 on #设置开机启动
Tips:
运行如下命令测试脚本是否可行:
./etc/init.d/uwsgi7070 start
这个地方碰到个错误,提示:
-bash: ./uwsgi7070: /bin/sh^M: bad interpreter: No such file or directory
查下了资料,是因为:sh脚本在windows系统下写的,不同系统的编码格式引起的。
解决方法:
vi test.sh #在vi的命令状态下执行下列指令: :set ff #看到如下信息 fileformat=dos #修改文件格式命令 :set ff=unix :wq (存盘退出)
四、配置Nginx的站点服务
最后一步配置项:
打开 /PHPstudy/server/Nginx/conf/vhosts/PHPstudy.conf 文件,添加自己的站点配置:
server { listen 80; server_name test.com; #你自己的域名或IP #配置资源文件,指定静态文件的位置,不然项目中css、js文件找不到,网站就没样式,也执行不了js脚本等 location /static/ { alias /web/sitesname/static/; allow all; } #重定向到uwsgi的配置 location / { include uwsgi_params; #使用uwsgi模式 uwsgi_pass 127.0.0.1:7070; #映射到前面定义的7070端口 uwsgi_param UWsgi_SCRIPT runapp; #前面定义的py模块名 uwsgi_param UWsgi_CHDIR /web/sitesname/; #站点目录 index index.html index.htm; } }
最后执行 PHPstudy restart或是reboot下看站点能否正常访问。
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:
django2.0:url(r''^static/(?P<path>.*)$'', ''django.views.static.serve'', {''document_root'': settings.STATIC_ROOT})
-
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.附上更改过程中看到的不错的文章:
1)Python3.x新特性以及十大变化
2)Django从1.8升级到2.0注意事项
3)Django 外键ForeignKey中的on_delete
django 为什么不主流,python 不是比 java 更优雅吗?
django 为什么不主流,python 不是比 java 更优雅吗?
关于为什么django 2在python 2下可用?和为什么使用django框架的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于$Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境、Centos7.2下nginx+uwsgi+python/Django搭建生产环境、Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项(转)、django 为什么不主流,python 不是比 java 更优雅吗?等相关内容,可以在本站寻找。
本文标签: