用户权限控制及部署
权限设置
在django为我们自动创建的表中,有一个时auth_permission
每当我们创建一张表的话,它会自动帮我们填充对这张表的权限。
这样可以为一个组的成员添加他可以拥有的权限,而在组中,可能有一些特殊的人,比如经理,他会有特殊的权限,我们还可以给他增加他自己的权限。
配置Django实现数据库读写分离
设置主从分离:https://www.cnblogs.com/kuxingseng95/p/9337686.html
django中知道会用到读写分离,可以很方便的进行配置。
django在进行数据库操作的时候,读取数据与写数据(增、删、改)可以分别从不同的数据库进行操作。
1. 在配置文件中增加slave数据库的配置
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST': '127.0.0.1', # 数据库主机 'PORT': 3306, # 数据库端口 'USER': 'meiduo1', # 数据库用户名 'PASSWORD': 'meiduo1', # 数据库用户密码 'NAME': 'meiduo' # 数据库名字 }, 'slave': { 'ENGINE': 'django.db.backends.mysql', 'HOST': '127.0.0.1', # 数据库主机 'PORT': 8306, # 数据库端口 'USER': 'root', # 数据库用户名 'PASSWORD': 'mysql', # 数据库用户密码 'NAME': 'meiduo' # 数据库名字 } }
2. 创建数据库操作的路由分发类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
在meiduo_mall/utils中创建db_router.py class MasterSlaveDBRouter(object): """数据库主从读写分离路由""" def db_for_read(self, model, **hints): """读数据库""" return "slave" def db_for_write(self, model, **hints): """写数据库""" return "default" def allow_relation(self, obj1, obj2, **hints): """是否运行关联操作""" return True
注:路由分发的时候,读和写指定不同的数据库即可实现读写的分离了。最后一个allow_relation是现在有多台机器了,还支持不支持关联操作了。
3. 配置读写分离路由
在配置文件中增加
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 配置读写分离 DATABASE_ROUTERS = ['meiduo_mall.utils.db_router.MasterSlaveDBRouter']
静态文件
我们在开发的时候会有django提供的静态文件的支持,比如xadmin中也是有js和css这样的样式设计的,当我们把DEBUG设置为False,进入生产模,不再以调试模式运行的时候,django就不再为我们提供这些js和css的静态文件了。
当Django运行在生产模式时,将不再提供静态文件的支持,需要将静态文件交给静态文件服务器。
我们先收集所有静态文件。项目中的静态文件除了我们使用的front_end_pc中之外,django本身还有自己的静态文件,如果rest_framework、xadmin、admin、ckeditor等。我们需要收集这些静态文件,集中一起放到静态文件服务器中。
我们要将收集的静态文件放到front_end_pc目录下的static目录中,所以先创建目录static。
Django提供了收集静态文件的方法。先在配置文件中配置收集之后存放的目录
STATIC_ROOT = os.path.join(os.path.dirname(os.path.dirname(BASE_DIR)), 'front_end_pc/static')
然后执行收集命令
python manage.py collectstatic
我们使用Nginx服务器作为静态文件服务器
这个是我安装nginx的目录了
- conf用来存放运行时读取的配置文件存储的地方
- logs是运行产生的日志文件
- sbin真正启动nginx的二进制程序
nginx.conf在启动的时候是唯一的入口。所以我们需要修改这个文件。
打开Nginx的配置文件
sudo vim /usr/local/nginx/conf/nginx.conf
在http中包裹的有一个server,每有一个server这样的大字典形式的东西就表示它运行了一个服务器向外提供,
- listen表示这个服务器监听的是哪个端口
- server_name表示前端以什么样的域名访问过来,我们前端的话我们会以www.meiduo.site这个地址访问过来。
- location就相当于django中的路由,如果是'/'开头的话就会匹配后面花括号中的东西
- root表示静态文件的存储路径
- index表示当用户以www.meiduo.site这样后面不带任何参数的情况下,是访问的是存放静态文件夹中的哪个文件。
在server部分中配置
server { listen 80; server_name www.meiduo.site; location / { root /home/python/Desktop/front_end_pc; index index.html index.htm; } # 余下省略 }
重启Nginx服务器
sudo /usr/local/nginx/sbin/nginx -s reload
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
首次启动nginx服务器 sudo /usr/local/nginx/sbin/nginx 停止nginx服务器 sudo /usr/local/nginx/sbin/nginx -s stop
动态接口
在项目中复制开发配置文件dev.py 到生产配置prod.py
修改配置文件prod.py中,由于没有其他的服务器,所以这里就设置一下本机部署要做的东西了。
DEBUG = True ALLOWED_HOSTS = [..., 'www.meiduo.site'] # 添加www.meiduo.site CORS_ORIGIN_WHITELIST = ( '127.0.0.1:8080', 'localhost:8080', 'www.meiduo.site:8080', 'api.meiduo.site:8000', 'www.meiduo.site', # 添加 )
修改wsgi.py文件
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "meiduo_mall.settings.prod")
django的程序通常使用uwsgi服务器来运行
安装uwsgi
pip install uwsgi
在项目目录/meiduo_mall 下创建uwsgi配置文件 uwsgi.ini,因为后面运行的时候会用uwsgi -ini来读取一个ini的配置文件
1 [uwsgi] 2 #使用nginx连接时使用,Django程序所在服务器地址 3 socket=192.168.233.139:8001 4 #直接做web服务器使用,Django程序所在服务器地址 5 #http=192.168.233.139:8000 6 #项目目录 7 chdir=/home/python/Desktop/meiduo/django_meiduo/meiduo_mall 8 #项目中wsgi.py文件的目录,相对于项目目录 9 wsgi-file=meiduo_mall/wsgi.py 10 # 进程数 11 processes=4 12 # 线程数 13 threads=2 14 # uwsgi服务器的角色 15 master=True 16 # 存放进程编号的文件,还是存放到了meiduo_mall的项目目录下 17 pidfile=uwsgi.pid 18 # 日志文件,因为uwsgi可以脱离终端在后台运行,日志看不见。我们以前的runserver是依赖终端的,还是存放到了meiduo_mall的项目目录下 19 daemonize=uwsgi.log 20 # 指定依赖的虚拟环境 21 virtualenv=/Users/delron/.virtualenv/django_meiduo
可以从下面的图看出当用户请求的时候是先经过Nginx的,然后到uwsgi。
第二行中,一开始进行uwsgi调试看其是否能正常运行的时候,我们会把第三行注释,将第五行解开注释,这样当用户访问的时候直接是到uwsgi里面的。当我们测试成功的话,就按照上面的设置方式。
当我们用uwsgi来帮我们运行项目的时候,uwsgi其实并不读取我们的manage.py的启动文件,而是通过wsgi.py
启动uwsgi服务器
uwsgi --ini uwsgi.ini
注意如果想要停止服务器,除了可以使用kill命令之外,还可以通过
uwsgi --stop uwsgi.pid
修改Nginx配置文件,让Nginx接收到请求后转发给uwsgi服务器
再添加一个server用于将后台请求转发到uwsgi。
include在转发的时候要把uwsgi配合的参数都包括进去,这个是固定的写法
uwsgi_pass表示在转发的时候以uwsgi的方式转发到哪里,这将uwsig运行的地方写进去就可以了比如上面这样,但是这样只能给一台进行转发。为了解决这个问题首先要定义个组,然后把要转发的服务器放到组中。
upstream表示建立一个组,meiduo是组的名字,server是声明
最后完成的就是这样的修改:
我们想进入xadmin和ckeditor的时候不通过api.meiduo.site而是用www.meiduo.site的话:
在接收到的时候让它转发到动态接口就可以了。
然后重启Nginx就可以了
sudo /usr/local/nginx/sbin/nginx -s reload