最近在开发网站过程中遇到了一个令我头疼的问题:
目标 | 对于一个django项目,需要开发另外域名的版本 |
---|---|
环境 | ubuntu nginx + uwsgi |
我的解决办法:
新建一个django项目,然后利用nginx和uwsgi解析到我需要的二级域名就好了,但是这个新网站的数据是不变的,也就是说还要使用之前的数据库,可这样跟以前就是两个项目,我不能直接import之前的models,而数据库又比较大复杂,重新建库不现实,我也可以直接使用MySQldb,就像这样:
import MySQLdb
def book_list(request):
db = MySQLdb.connect(user='me', db='mydb', passwd='secret', host='localhost')
cursor = db.cursor()
cursor.execute('SELECT name FROM books ORDER BY name')
names = [row[0] for row in cursor.fetchall()]
db.close()
return render_to_response('book_list.html', {'names': names})
但是考虑了一下这样太不方便了,每次都要连接查询,不合适我的需求。
又在网上找了半天,幸好看到有人说django-host,很是符合,接下来记录一下具体使用过程:
django的第三方扩展包django-hosts的安装使用,github地址
安装
pip install django-hosts
django manage.py startapp api #域名api.example.com
django manage.py startapp beta #域名beta.example.com
配置
在项目settins.py的同级目录下新建文件hosts.py:
from django_hosts import patterns, host
host_patterns = patterns('path.to',
host(r'api', 'api.urls', name='api'),
host(r'beta', 'beta.urls', name='beta'),
)
打开项目setting.py,
1,在INSTALLED_APPS添加:'django_hosts'
2,在MIDDLEWARE添加:
'django_hosts.middleware.HostsRequestMiddleware'
......
'django_hosts.middleware.HostsRequestMiddleware'
#要在middleware最开始和最后都添加
3,在ROOT_URLCONF后添加:
ROOT_HOSTCONF = '项目名.hosts'
DEFAULT_HOST='api(或者beta)' #这是设置的默认域名,即在未匹配到正确的二级域名时,默认跳转到此,但这必须是在host.py中设置好的才能找到。
PARENT_HOST = 'example.com' #在呈现的URL的域部分附加一个默认域名
接下来处理各个app的url,打开项目的urls.py:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('www.urls', namespace='www')),
path('api/', include('api.urls', namespace='api')),
path('beta/', include('beta.urls', namespace='beta')),
]
api的urls.py:
from django.urls import path
from .views import index
app_name = 'api'
urlpatterns = [
path('', index, name='index'),
]
beta的urls.py:
from django.urls import path
from .views import index
app_name = 'beta'
urlpatterns = [
path('', index, name='index'),
]
配置nginx
找到nginx的配置文件添加:
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:8080/;
}
}
server {
listen 80;
server_name beta.example.com;
location / {
proxy_pass http://127.0.0.1:8080/;
}
}
保存后重新载入:
nginx -s reload
uwsgi还使用之前的即可,无需更新。
html问题
使用了django-hosts后html会报错:
使用Django的URL template tag会报错:
u'xxx' is not a registered namespace
所以我直接用具体的url来指向就好了,避免错误。
查到一篇文章,链接,是这样解决的:
{#<a href="{% url 'blog:list' %}">进入BLOG列表</a>#}
<h4><a href="{% host_url 'list' host 'blog' %}">进入BLOG列表(django-hosts)</a></h4>
注意:任何与该App有关的用过host_url的模板中,都不能出现Django中的url
但是我试了没成功,可能哪里有错误,就直接用url了。