用户权限控制及部署

权限设置

在django为我们自动创建的表中,有一个时auth_permission

每当我们创建一张表的话,它会自动帮我们填充对这张表的权限。

这样可以为一个组的成员添加他可以拥有的权限,而在组中,可能有一些特殊的人,比如经理,他会有特殊的权限,我们还可以给他增加他自己的权限。

 配置Django实现数据库读写分离

设置主从分离:https://www.cnblogs.com/kuxingseng95/p/9337686.html

django中知道会用到读写分离,可以很方便的进行配置。

django在进行数据库操作的时候,读取数据与写数据(增、删、改)可以分别从不同的数据库进行操作。

1. 在配置文件中增加slave数据库的配置

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'  # 数据库名字
    }
}
View Code

2. 创建数据库操作的路由分发类

在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
View Code

注:路由分发的时候,读和写指定不同的数据库即可实现读写的分离了。最后一个allow_relation是现在有多台机器了,还支持不支持关联操作了。

3. 配置读写分离路由

在配置文件中增加

# 配置读写分离
DATABASE_ROUTERS = ['meiduo_mall.utils.db_router.MasterSlaveDBRouter']
View Code

静态文件

我们在开发的时候会有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
首次启动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

 

posted @ 2018-07-19 23:00  苦行僧95  阅读(30)  评论(0编辑  收藏  举报