初探django-演示charade在centos7下的部署

=======================================

2016/3/3


####charade 是一个猜单词的小游戏。

https://github.com/opera443399/charade

prepare
-------
1. pip+django ::

        主要依赖:
        [root@tvm001 ~]# yum install python-pip
        [root@tvm001 ~]# pip install django
        
        其他依赖:
        django 项目用到了 pytz,需要安装:
        # https://docs.djangoproject.com/es/1.9/topics/i18n/timezones/
        [root@tvm001 ~]# pip install pytz
        
        upload 这个 app 用到了 Pillow,需要安装:
        [root@tvm001 ~]# pip install Pillow
        如果报错类似:"ValueError: jpeg is required ....",则:
        [root@tvm001 ~]# yum install libjpeg-devel
        


2. 调整 project setting ::

        [root@tvm001 ~]# cd /opt
        直接克隆这个项目
        [root@tvm001 opt]# git clone https://github.com/opera443399/charade.git
        [root@tvm001 opt]# cd charade/www/


3. 试着运行一下 ::

        django默认是启用了 DEBUG 选项,但 charade 这个项目的代码已经关闭 DEBUG 选项,并设置了一下内容:
        ALLOWED_HOSTS
        STATIC_URL STATIC_ROOT
        MEDIA_URL MEDIA_ROOT
        
        具体请参考下面的示例:
        [root@tvm001 www]# vim www/settings.py
        DEBUG = False

        ALLOWED_HOSTS = ['*']
        
        # Static files (CSS, JavaScript, Images)
        # https://docs.djangoproject.com/en/1.9/howto/static-files/
        
        STATIC_URL = '/static/'
        STATIC_ROOT = os.path.join(BASE_DIR, 'static')
        
        # Upload files
        # https://docs.djangoproject.com/en/1.9/howto/static-files/#serving-files-uploaded-by-a-user-during-development
        # https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#std:templatetag-get_media_prefix
        MEDIA_URL = '/media/'
        MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
        
        和 MEDIA 相关的调整如下:
        [root@tvm001 www]# vim www/urls.py
        from django.conf import settings
        from django.conf.urls.static import static
        
        urlpatterns = [
            # ... the rest of your URLconf goes here ...
        ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

        现在,先临时调整配置:
        [root@tvm001 www]# vim www/settings.py
        DEBUG = True

        运行服务:
        [root@tvm001 www]# python manage.py runserver 0.0.0.0:80
        在浏览器访问,测试确认后台的数据读写无异常后,停止运行,后续将使用uwsgi来管理。


4. admin后台 ::

        [root@tvm001 www]# python manage.py createsuperuser
        根据提示创建root密码用于登录后台。
        访问地址:http://you_server_ip/admin/


5. debug ::

        DEBUG 选项处于关闭状态时,则 django 不处理静态文件,此时应该配置nginx或apache来处理静态文件。


6. i18n(国际化和本地化) ::

        增加中间件:locale
        设置可选语言:LANGUAGES
        [root@tvm01 www]# vim www/settings.py
        MIDDLEWARE_CLASSES = [
            (略)
            'django.contrib.sessions.middleware.SessionMiddleware',
            'django.middleware.locale.LocaleMiddleware',
            'django.middleware.common.CommonMiddleware',
            (略)
        ]

        LANGUAGES = [
            ('en', 'English'),
            ('zh-cn', 'zh'),
        ]

        启用 django 自带的语言偏好设置的视图
        [root@tvm01 www]# vim www/urls.py
        urlpatterns = [
            (略)
            url(r'^i18n/', include('django.conf.urls.i18n')),
        ]


        维护翻译文件,在每个 apps 目录下有一个 locale 目录,以 charade 为例:
        创建或更新:
        [root@tvm01 charade]# django-admin makemessages -l zh
        对应的消息文本的路径:locale/zh/LC_MESSAGES/django.po

        编译:
        [root@tvm01 charade]# django-admin compilemessages
        编译后的文件:locale/zh/LC_MESSAGES/django.mo

        最后,重载(reload) web服务即可生效。


7. Email ::

        配置smtp帐号信息,增加如下所示 email 相关的信息
        [root@tvm01 www]# vim www/settings.py
        # email
        EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
        EMAIL_USE_TLS = False
        EMAIL_HOST = 'smtp.xxx.com'
        EMAIL_PORT = 25
        EMAIL_HOST_USER = 'test@xxx.com'
        EMAIL_HOST_PASSWORD = 'TestEmail'
        DEFAULT_FROM_EMAIL = 'TestEmail <test@xxx.com>'

        如果要在 accounts 这个 app 中启用 '注册账户时,发送激活账户的邮件'功能,则:
        编辑 apps.py,调整配置文件如下所示:
        [root@tvm01 www]# vim www/accounts/apps.py
        IS_NEW_USER_NEED_VERIFY_BY_EMAIL = True



uwsgi+supervisord+nginx
----------------------
1. 安装 ::

        [root@tvm001 www]# yum install nginx python-devel
        [root@tvm001 www]# yum groupinstall "development tools"
        [root@tvm001 www]# pip install supervisor
        [root@tvm001 www]# whereis supervisord
        supervisord: /usr/bin/supervisord /etc/supervisord.conf

        [root@tvm001 www]# pip install uwsgi
        [root@tvm001 www]# whereis uwsgi
        uwsgi: /usr/bin/uwsgi

2. 配置 ::

    1) 收集django项目的static文件:

        [root@tvm001 www]# python manage.py collectstatic

    2) 使用supervisor来管理uwsgi服务,用uwsgi来运行django:

        [root@tvm001 www]# # echo_supervisord_conf > /etc/supervisord.conf \
        && mkdir /etc/supervisor.d \
        && echo -e '[include]\nfiles=/etc/supervisor.d/*.ini' >>/etc/supervisord.conf \
        && grep ^[^\;] /etc/supervisord.conf

        [root@tvm001 www]# whereis supervisord

    4) 启动 supervisord 服务:

        [root@tvm001 www]# /usr/bin/supervisord -c /etc/supervisord.conf
        [root@tvm001 www]# echo '/usr/bin/supervisord -c /etc/supervisord.conf' >>/etc/rc.local

    5) 配置uwsgi服务:

        [root@tvm001 www]# cat /etc/supervisor.d/uwsgi.ini
        [program:uwsgi]
        command=/usr/bin/uwsgi --socket 127.0.0.1:8090 --chdir /opt/charade/www --module www.wsgi
        user=nobody
        autostart=true
        autorestart=true
        stdout_logfile=/tmp/charade.stdout.log
        stderr_logfile=/tmp/charade.stderr.log

        注:这里配置了 user,对应的,project的目录也应该是这个用户才能对示例中的本地数据库有读写权限。
        [root@tvm001 www]# chown nobody:nobody -R /opt/charade/www

    6)启动 uwsgi 服务:

        [root@tvm001 www]# supervisorctl reload
        Restarted supervisord
        [root@tvm001 www]# supervisorctl status
        uwsgi                            RUNNING   pid 5303, uptime 0:00:04

        说明:
        uwsgi 使用 --socket 方式,表示:通过socket来访问,因此后续可以用 nginx uwsgi 模块来访问。
        uwsgi 使用 --http 方式,表示:可以直接通过 http访问,因此后续可以用 nginx proxy 来访问。


    7) 使用nginx来处理静态文件和转发请求到后端的uwsgi服务

        a)nginx uwsgi
        [root@tvm001 www]# cat /etc/nginx/conf.d/www.conf
        server {
            listen 80 default;
            server_name www.test.com;
            charset utf-8;
            
            location /static {
                alias /opt/charade/www/static;
            }
            
            location /media {
                alias /opt/charade/www/media;
            }
            
            location / {
                uwsgi_pass 127.0.0.1:8090;
                include uwsgi_params;
            }
        }

        b)nginx proxy
        [root@tvm001 www]# cat /etc/nginx/conf.d/www.conf
        upstream backend {
            server 127.0.0.1:8090;
        }

        server {
            listen 80 default;
            server_name www.test.com;
            charset utf-8;
            
            location /static {
                alias /opt/charade/www/static;
            }
            
            location /media {
                alias /opt/charade/www/media;
            }
            
            location / {
                proxy_pass http://backend;
            }
        }

        (centos7)
        [root@tvm001 www]# systemctl start nginx.service
        [root@tvm001 www]# systemctl enable nginx.service