天天看点

django 多域名多app 问题 --django-host

场景

我们使用django 开发网站,一个项目下需要两个app,比如一个是天气预报,一个是交通。我们分别起名为weather_app,traffic_app。

如果使用一个域名,如www.test.com/weather 和www.test.com/traffic

这样不会引入是什么问题,直接使用django的urls解析没有问题。

但是如果想要专业点,使用weather.test.com对应 weather_app。traffic.test.com 对应 traffic_app 。如何实现呢

安装

我们这里可以安装这个插件 django-host

github地址 :https://github.com/jazzband/django-hosts

pip install django-host

配置

这里要提前说明下,我的部署环境是centos7下 nginx + uwsgi + django

多站点部署的前提是,你要对nginx uwsgi 已经有所了解,这样方便你理解我们在做什么。

1.添加'django_hosts'到 项目的settings 文件 INSTALLED_APP中;

2.添加'django_hosts.middleware.HostsRequestMiddleware'到项目的settings 文件 MIDDLEWARE 中的开始位置;

3.添加'django_hosts.middleware.HostsRequestMiddleware'到项目的settings 文件 MIDDLEWARE 中的结束位置;(就是前后都要放)

4.在settings.py 所在的文件夹创建一个名叫host.py 的文件,写入下面的内容。
           
from django_hosts import patterns, host #导入django-host
from django.conf import settings        #导入settings

from ss_update import views #导入app1,我的app1叫ss_update
from translate import views #导入app2,我的app2叫translate

host_patterns = patterns('',
    host(r'www', 'ss_update.urls', name='www'),      #子域名,类似weather.test.com中的weather
    host(r'translate', 'translate.urls', name='translate'), #子域名,类似translate.test.com 中的translate
)
           
5.在settings.py中,在ROOT_URLCONF之后增加  
ROOT_HOSTCONF = '项目文件夹名.host' #不是app名

6.在settings.py中,在ROOT_HOSTCONF之后增加
DEFAULT_HOST='www' #这里在未匹配到正确的二级域名时,默认选择一个,默认的必须是你在host.py中设置的。否则启动时,会提示找不到。

7.在不同的app下创建属于他们自己的urls.py 来替代原始的urls.py
说到这里你应该明白了,django-host 的作用就是使得针对不同的二级域名,解析道它们对应的app下的urls.py
           
from django.conf.urls import url
from django.contrib import admin
from views import *
urlpatterns = [
    url(r'^index$', index),
]
           

这个就是类似你在不同app下创建urls.py的样子,注意

from views import *

这个地方

到这里就设置好了。

uwsgi 和nginx 的配置就和一个app时一样。这个插件是从django的角度去解决多app,多域名的方法。貌似也是可以使用nginx 中的各种代理去配置,我个人还是喜欢这种方法。

还是简单的贴下我的配置文件。

uwsgi.ini

# myweb_uwsgi.ini file
[uwsgi]

# Django-related settings


socket =127.0.0.1:8000

# the base directory (full path)
chdir  = /home/auto_ss   #auto_ss为我的项目根目录

# Django s wsgi file
wsgi-file  = auto_ss/wsgi.py   #启动文件位置

# master
master      = true
py-autoreload = 1   #这个配置项,如果djaong文件变化自动重新加载,不用每次手动重启

# maximum number of worker processes
processes       = 4
threads         = 2

stats  =127.0.0.1:9191
buffer-size=32768
           

nginx配置文件

#第一个域名
server {
        listen       ;
        server_name  www.test.com;
        #root         /usr/share/nginx/html;
        # Load configuration files for the default server block.
        #include /etc/nginx/default.d/*.conf;
        location / {
          include uwsgi_params;
          uwsgi_pass :;
                }
    }

#第二个域名
server {
        listen       ;
        server_name  teanslate.test.com;
        #root         /usr/share/nginx/html;
        # Load configuration files for the default server block.
        #include /etc/nginx/default.d/*.conf;
        location / {
          include uwsgi_params;
          uwsgi_pass :;
                    }
        }
           

这个django-host 插件我也是摸索着用的,如果你有其中不理解不明白的,欢迎留言讨论。