GVKun编程网logo

为什么django 2在python 2下可用?(为什么使用django框架)

24

本篇文章给大家谈谈为什么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 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。

因此,我的问题如下:

  1. 为什么pip尝试使用python2安装Django2,而不是自动选择最新的兼容版本?那不是pip功能的一部分吗?
  2. 有没有一种方法可以使从python2运行和与python3运行时requirements.txt安装的单个安装?Django<2.0``Django>=2.0

$Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境

$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 创建多表模型(详情见代码)
  #用了OneToOneFieldForeignKey,模型表的字段,后面会自定加_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搭建生产环境

Centos7.2下nginx+uwsgi+python/Django搭建生产环境

【查了很多资料并尝试,刚配置好的生产环境,记录下,免得忘了。】

python/Django在开发时使用命令如下来运行测试:

python manage.py runserver 0.0.0.0:8000

但在真正部署运行时不能这么用,得配合Nginx+uwsgi来部署(这两个做什么用网络上资料很多)。
为了省去中间繁琐的不必要的配置步骤,采用如下集成包:

  1. Anaconda3-4.4.0 for
    Linux,Python的运行环境,包含了很多常用的库,下载地址:https://repo.continuum.io/archive/Anaconda3-4.4.0-Linux-x86_64.sh

  2. PHPStudy 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注意事项(转)

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

django 为什么不主流,python 不是比 java 更优雅吗?

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 更优雅吗?等相关内容,可以在本站寻找。

本文标签: